2010-08-21 4 views
2

J'essaie d'utiliser Reflection en C# pour déterminer à l'exécution le type d'objets dans une propriété de collection. Ces objets sont des entités générées par Entity Framework:Comment déterminer le type d'objets dans une collection en C#

Type t = entity.GetType(); 
PropertyInfo [] propInfo = t.GetProperties(); 
foreach(PropertyInfo pi in propInfo) 
{ 
    if (pi.PropertyType.IsGenericType) 
    { 
     if (pi.PropertyType.GetGenericTypeDefinition() 
      == typeof(EntityCollection<>)) 
     // 'ToString().Contains("EntityCollection"))' removed d2 TimWi's advice 
     // 
     // ---> this is where I need to get the underlying type 
     // ---> of the objects in the collection :-) 
     // etc. 
    } 
} 

Comment identifier le type d'objets détenus par la collection?

EDIT: code mis à jour ci-dessus, en ajoutant la première requête de .IsGenericType pour le faire fonctionner

+0

Quel est le problème que vous essayez de résoudre? Pourquoi avez-vous besoin de connaître les types dans la collection? Je suppose qu'ils ne sont pas tous du même type? – PatrickSteele

+0

En fait, ils sont du même type. Je dois créer un nouvel objet et laisser l'utilisateur définir ses valeurs, mais je ne connais pas le type au moment du design. Donc, en utilisant la réflexion, j'obtiendrai et invoquerai le constructeur, pour finalement ajouter le nouvel objet à la collection appropriée. – Jay

Répondre

3

Vous pouvez utiliser GetGenericArguments() pour récupérer les arguments génériques du type de collection (par exemple, pour EntityCollection<string>, l'argument générique est string). Depuis EntityCollection<> a toujours un argument générique, GetGenericArguments() vaudra toujours un tableau à un seul élément, vous pouvez donc récupérer en toute sécurité le premier élément de ce tableau:

if (pi.PropertyType.IsGeneric && 
    pi.PropertyType.GetGenericTypeDefinition() == typeof(EntityCollection<>)) 
{ 
    // This is now safe 
    var elementType = pi.PropertyType.GetGenericArguments()[0]; 

    // ... 
} 
+0

article [0]? Voulez-vous dire le "GetGenericArguments()"? Ce ne serait pas vide. –

+0

Bon point Kirk, corrigé. J'ai mal compris le code pour interroger l'élément [0] de la collection d'objets d'entité (qui aurait pu être vide) par rapport à l'interrogation de l'élément [0] de GenericArguments. – Jay

+0

Merci Timwi. Le seul problème est qu'une exception est levée si la propriété n'est pas un type générique. J'ai mis à jour ma question avec vos suggestions et la ligne supplémentaire "if (pi.PropertyType.IsGenericType)". – Jay

Questions connexes