2010-10-13 13 views
3

Nous avons un DAL que nous utilisons avec NHibernate.Search, donc les classes qui ont besoin d'être indexées sont décorées avec un attribut Indexed(Index:="ClassName"), et chaque propriété qui doit être indexée a un attribut Field(Index:=Index.Tokenized, Store:=Store.No). Quand on veut que l'index descende des objets spéciaux, il y a l'attribut IndexedEmbedded()Comment récupérer le type générique utilisé dans un IEnumerable générique dans .net?

Afin d'auto-documenter notre hiérarchie d'indexation, j'ai construit un simple analyseur qui parcourt l'ensemble DAL, récupère toute classe marquée comme indexable et obtient les propriétés qui sont indexables ou dont le type est disponible pour l'exploration. Quand le type de la propriété est déclaré disponible pour l'exploration, je pousse ce type dans la file d'attente et je le traite aussi.

Le problème est que parmi les classes que vous pouvez explorer, certaines sont elles-mêmes contenues dans des collections génériques IEnumerable. J'aimerais obtenir le type utilisé pour la collection (habituellement ISet) pour l'analyser aussi.

Alors, quel est le moyen d'obtenir le type interne d'une collection?

Private m_TheMysteriousList As ISet(Of ThisClass) 
<IndexedEmbedded()> _ 
Public Overridable Property GetToIt() As ISet(Of ThisClass) 
    Get 
     Return m_TheMysteriousList 
    End Get 
    Set(ByVal value As ISet(Of ThisClass)) 
     m_TheMysteriousList = value 
    End Set 
End Property 

Comment puis-je obtenir à ThisClass quand j'ai le PropertyInfo pour GetToIt?

Répondre

4

Quelque chose comme:

public static Type GetEnumerableType(Type type) 
{ 
    if (type == null) throw new ArgumentNullException(); 
    foreach (Type interfaceType in type.GetInterfaces()) 
    { 
     if (interfaceType.IsGenericType && 
      interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) 
     { 
      return interfaceType.GetGenericArguments()[0]; 
     } 
    } 
    return null; 
} 
... 
PropertyInfo prop = ... 
Type enumerableType = GetEnumerableType(prop.PropertyType); 

(je l'ai utilisé IEnumerable<T> ici, mais il est facilement ajustée en fonction de toute autre interface similaire)

+0

sans défaut; le GetgenericArguments était en effet où je cherchais la solution, mais je n'aurais pas eu l'idée de la chercher dans les interfaces. Merci – samy