2015-08-02 13 views
9

Was ist der Unterschied zwischen Type.IsGenericType und Type.IsGenericTypeDefinition? Interessanterweise ist MSDNs Verknüpfung für IsGenericTypeDefinition gebrochen.Unterschied zwischen IsGenericType und IsGenericTypeDefinition

Nachdem ich ein wenig mit dem Versuch gespielt habe, alle in einem DbContext definierten DbSets abzurufen, führte ich zu folgendem: Welches Verhalten versuche ich zu verstehen: Das Filtern von Eigenschaften über IsGenericType gibt die gewünschten Ergebnisse zurück, während IsGenericTypeDefinition nicht (gibt keine zurück).

Es ist interessant, dass von this Post habe ich den Eindruck, dass der Autor seine DbSets mit IsGenericTypeDefinition bekommen, während ich nicht habe.

folgt ein Beispiel, das die Diskussion zeigt:

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; } 
} 

Antwort

16

IsGenericType sagt Ihnen, dass diese Instanz von System.Type mit all seinen Typ Parameter spezifiziert einen generischen Typ darstellt. Zum Beispiel ist List<int> ein generischer Typ.

IsGenericTypeDefinition, teilt Ihnen jedoch mit, dass diese Instanz von System.Type eine Definition darstellt, aus der generische Typen durch die Bereitstellung von Typargumenten für ihre Typparameter konstruiert werden können. Zum Beispiel ist List<> eine generische Typdefinition.

Sie können eine generische Typdefinition eines generischen Typs erhalten, indem GetGenericTypeDefinition Aufruf:

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

Sie einen generischen Typ aus einer generischen Typdefinition machen kann es mit Art Argumente MakeGenericType durch:

var listDef = typeof(List<>); 
var listStr = listDef.MakeGenericType(typeof(string)); 
+0

Stimmen Sie nicht zu, dass es keinen Sinn macht, dass [hier] (http://stackoverflow.com/questions/6304702/cast-propertyinfo-to-generic-type) der Autor DbSet-Instanzen mit IsGenericTypeDefinition bekommt? Basierend auf Ihrer Antwort (und einigen Tests von meiner Seite), erhalten Sie DbSet nicht als Eigenschaften zurück, wenn Sie 'GetProperties() ausführen. Wo (p => p.IsGenericTypeDefinition)' – Veverke

+0

@ Veverke Sie haben absolut Recht, der Autor der Antwort Copy-pasted OP-Code mit einem Fehler. Ich habe diese Antwort bearbeitet, vielen Dank! – dasblinkenlight

+0

Mit anderen Worten, ein Typ, für den IsGenericType den Wert true zurückgibt, ist ein generischer Typ "real/complete/usable". Ein Typ, für den IsGenericTypeDefinition true ist, ist im Code noch nicht wirklich verwendbar, es ist ein generischer Typ "Blueprint/Container". – Veverke

Verwandte Themen