如何检索.net中通用IEnumerable中使用的泛型类型?

时间:2010-10-13 08:48:09

标签: .net reflection types ienumerable

我们有一个与NHibernate.Search一起使用的DAL,因此需要编制索引的类使用属性Indexed(Index:="ClassName")进行修饰,并且需要编制索引的每个属性都有一个属性{ {1}}。当人们希望索引向下钻取特殊对象时,会有属性Field(Index:=Index.Tokenized, Store:=Store.No)

为了自动记录我们的索引层次结构,我构建了一个运行在DAL程序集中的简单解析器,选取任何标记为可索引的类,并获取可索引或其类型可用于钻取的属性 - 下。当声明属性的类型可用于向下钻取时,我将此类型推入队列并进行处理。

问题是,在可以深入研究的类中,有些类本身包含在IEnumerable泛型集合中。我想得到用于集合的类型(通常是ISet)来解析它。

那么获取集合内部类型的方法是什么?

IndexedEmbedded()

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

1 个答案:

答案 0 :(得分: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>,但很容易调整以适应任何其他类似的界面)