2010-10-13 51 views
3

我們有一個與NHibernate.Search一起使用的DAL,因此需要編制索引的類使用屬性Indexed(Index:="ClassName")進行修飾,每個需要被索引的屬性都有一個屬性Field(Index:=Index.Tokenized, Store:=Store.No)。當需要索引深入特殊對象時,有屬性IndexedEmbedded()如何檢索.net中泛型IEnumerable中使用的泛型類型?

爲了自動記錄我們的索引層次結構,我構建了一個簡單的解析器,它通過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時,我有PropertyInfoGetToIt

回答

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

無瑕; GetgenericArguments確實是我在尋找解決方案的地方,但我不會立刻想到在接口中尋找它。謝謝 – samy 2010-10-13 09:52:50