我们有一个与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
?
答案 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>
,但很容易调整以适应任何其他类似的界面)