2010-10-13 2 views
3

У нас есть DAL, который мы используем с NHibernate.Search, поэтому классы, которые необходимо индексировать, украшены атрибутом Indexed(Index:="ClassName"), и каждое свойство, которое необходимо индексировать, имеет атрибут Field(Index:=Index.Tokenized, Store:=Store.No). Когда требуется индексировать специальные объекты, есть атрибут IndexedEmbedded()Как получить общий тип, используемый в общем IEnumerable в .net?

Для автоматической документирования нашей иерархии индексирования я построил простой синтаксический анализатор, который проходит через узел DAL, выбирает любой класс, помеченный как индексируемый и получает свойства, которые являются либо индексируемыми, либо тип которых доступен для развертки. Когда тип свойства объявляется доступным для детализации, я нажимаю этот тип в очередь и обрабатываю его.

Проблема в том, что среди классов, которые вы можете развернуть, некоторые из них содержатся в общих коллекциях IEnumerable. Я хотел бы получить тип, используемый для коллекции (обычно ISet), чтобы разобрать его.

Итак, каков способ получить внутренний тип коллекции?

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 

Как я добраться до ThisClass, когда у меня есть PropertyInfo для GetToIt?

ответ

4

Что-то вроде:

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

(я использовал IEnumerable<T> здесь, но это легко настраивается в соответствии с каким-либо другим подобным интерфейсом)

+0

Flawless; GetgenericArguments действительно был тем местом, где я искал решение, но у меня не было бы сразу искать его в интерфейсах. благодаря – samy

Смежные вопросы