是否有一般方法来检测属性的类型是否是可枚举类型?

时间:2011-06-26 09:16:01

标签: c#

鉴于此:

class InvoiceHeader {
    public int InvoiceHeaderId { get; set; }
    IList<InvoiceDetail> LineItems { get; set; }
}

我目前正在使用此代码来检测某个类是否具有集合属性:

void DetectCollection(object modelSource)
{       
    Type modelSourceType = modelSource.GetType();
    foreach (PropertyInfo p in modelSourceType.GetProperties())
    {
        if (p.PropertyType.IsGenericType &&  p.PropertyType.GetGenericTypeDefinition() == typeof(IList<>))
        {
            System.Windows.Forms.MessageBox.Show(p.Name);
        }
    }
}

是否有一般检测LineItems是否为可枚举类型?有些人会使用其他可枚举的类型(例如ICollection),而不是IList。

4 个答案:

答案 0 :(得分:44)

您的代码实际上并未检查属性是否为Enumerable类型,但它们是否为通用IList。试试这个:

if(typeof(Enumerable).IsAssignableFrom(p.PropertyType))
{
   System.Windows.Forms.MessageBox.Show(p.Name);
}

或者这个

if (p.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
{
    System.Windows.Forms.MessageBox.Show(p.Name);
}

答案 1 :(得分:2)

if (invoiceHeader.LineItems is IEnumerable) {
    // LineItems implements IEnumerable
}

如果invoiceHeader的类型在编译时未知,则不起作用。在这种情况下,我想知道为什么没有通用接口,因为使用反射来查找集合属性是非常可疑的。

答案 2 :(得分:1)

IEnumerable是C#中所有Enumerable类型的基类型,因此您可以检查属性是否通常属于该类型。

但是应该注意C#在绑定糖语法方面是特殊的(例如foreach循环),它与方法绑定(因此,为了完整检查,你应该检查属性是否包含一个名为GetEnumerator的方法(要么是IEnumerable) .GetEnumerator或IEnumerable.GetEnumerator)

答案 3 :(得分:-2)

data.consumption

这在使用实体框架上下文时对我有用。