我需要使用反射来过滤掉集合的所有对象属性。它们并不总是泛型列表,而是继承了List<T>
类型的类。举个例子,我有一个类foo
它的性质是fooCollection
。FooColection
如下所示:
public class foo
{
public FooCollection myCollection {get;set;}
}
public class fooCollection : List<Foo>
{
}
我不知道List<T>
的类型是什么,但只需要知道它是否是一个集合。我怎样才能知道呢?我先问了一个问题,但措辞不同,结果不适用于我的特定实例。
我尝试了以下示例,在这里我查看foo
的所有属性,并尝试找到fooColelction
的属性:
typeof(IEnumerable<>).IsAssignableFrom(prop.PropertyType)
这是不正常工作为我虽然。类型不是IEnumerable
,尽管它是一个集合。它继承了IEnumerable
类型。
下面是一个名为Policy
的类对象的集合类的例子。
public class PolicyCollection : List<Policy>
{
/// <summary>
/// This function takes a xml Policy collection and builds a PolicyCollection Class
/// </summary>
/// <param name="xDocPolicyCollection">XML Document of an PolicyCollection</param>
protected internal void LoadXml(XmlDocument xDocPolicyCollection)
{
foreach (XmlNode n in xDocPolicyCollection.GetElementsByTagName("Policy"))
{
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(n.OuterXml);
Policy p = new Policy();
p.LoadXml(xdoc);
Add(p);
}
}
/// <summary>
/// This function takes a datatable of Policies collection and builds a PolicyCollection Class
/// </summary>
/// <param name="dtContact">Data</param>
protected internal void LoadDB(DataTable dtPolicyCollection)
{
foreach (DataRow dr in dtPolicyCollection.Rows)
{
Policy p = new Policy();
p.LoadDB(dr);
Add(p);
}
}
}
这是不同的,然后之前的问题,因为我问如何检查这个场景的属性类型,是一个常规类,继承List<T>
,而不是一个属性,是List<T>
。
主要的问题是一个非具体化的泛型类型(比如IEnumerable<>
)永远不能被赋值,. net泛型根本不能这样工作。
你可以这样写:
typeof(PolicyCollection)
.GetInterfaces()
.Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>))
GetInterfaces
返回所有由给定类型实现的接口,然后您只需检查是否有任何东西是IEnumerable<>
。通过显式地取消对找到的泛型接口的具体化,我们可以与IEnumerable<>
(或IList<>
或任何您喜欢的)进行简单的比较。
当然,由于IEnumerable<>
也"要求"IEnumerable
,您可以简单地检查它,而不是通用接口:
typeof(IEnumerable).IsAssignableFrom(typeof(PolicyCollection));