2015-08-02 38 views
9

Type.IsGenericType ve Type.IsGenericTypeDefinition arasındaki fark nedir? İlginçtir, MSDN IsGenericTypeDefinition için bağlantı bozuk.IsGenericType ve IsGenericTypeDefinition arasındaki fark

Belirli bir DbContext'te tanımlanan tüm DbSet'leri almaya çalışırken biraz oynadıktan sonra, aşağıdakileri yapmaya çalıştım, anlamaya çalıştığım davranış: IsGenericType ile filtreleme özellikleri istenen sonuçları döndürürken, IsGenericTypeDefinition ile (herhangi bir geri dönmez).

this post'tan, yazarın DGSet'lerini IsGenericTypeDefinition kullanarak almadığı izlenimim var.

private static void Main(string[] args) 
{ 
    A a = new A(); 
    int propertyCount = a.GetType().GetProperties().Where(p => p.PropertyType.IsGenericType).Count(); 
    int propertyCount2 = a.GetType().GetProperties().Where(p => p.PropertyType.IsGenericTypeDefinition).Count(); 

    Console.WriteLine("count1: {0} count2: {1}", propertyCount, propertyCount2); 
} 

// Output: count1: 1 count2: 0 

public class A 
{ 
    public string aaa { get; set; } 
    public List<int> myList { get; set; } 
} 

cevap

16

IsGenericTypeSystem.Type bu örneği belirtilen tüm tip parametreleri ile genel bir türünü temsil ettiğini söyler:

tartışmayı gösteren bir örnek Şöyledir. Örneğin, List<int> genel bir türüdür. Öte yandan, System.Type'un bu örneğinin, tür parametreleri için tür bağımsız değişkenleri sağlayarak jenerik türlerin oluşturulabileceği bir tanımı temsil ettiğini söyler. Örneğin, List<> genel bir tür tanımdır.

Sen GetGenericTypeDefinition arayarak jenerik türde bir genel tür tanımı alabilirsiniz:

var listInt = typeof(List<int>); 
var typeDef = listInt.GetGenericTypeDefinition(); // gives typeof(List<>) 

Sen MakeGenericType tip argümanlarla da sağlayarak bir genel tür tanımından genel bir tür yapabilirsiniz:

+0

Yazarın [burada] (http://stackoverflow.com/questions/6304702/cast-propertyinfo-to-generic-type) IsGenericTypeDefinition kullanarak DbSet örneklerini almasının anlamsız olduğunu kabul etmiyor musunuz?) ('. Nerede (p => p.IsGenericTypeDefinition) arasında' – Veverke

+0

Kesinlikle haklısın @Veverke, yazar GetProperties yaparken Cevabınız (ve benim tarafımdan bazı testler) dayanarak, DbSet özellikleri gibi döndü almazsınız kopyala yapıştırılan OP'nin kodunu bir hatayla yanıtlayın. Bu cevaba bir değişiklik yaptım, çok teşekkür ederim! – dasblinkenlight

+0

Başka bir deyişle, IsGenericType öğesinin true olarak döndürdüğü bir tür "gerçek/tam/kullanılabilir" genel türdür. IsGenericTypeDefinition'ın true olduğu bir tür, henüz kodda kullanılamaz, genel bir "blueprint/container" türüdür. – Veverke