用反射判断一个类属性是否是继承了List或者任何类型的集合

本文关键字:List 或者 集合 类型 任何 继承 是否是 判断 反射 属性 一个 | 更新日期: 2023-09-27 18:17:39

我需要使用反射来过滤掉集合的所有对象属性。它们并不总是泛型列表,而是继承了List<T>类型的类。举个例子,我有一个类foo它的性质是fooCollectionFooColection如下所示:

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>

用反射判断一个类属性是否是继承了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));
相关文章: