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

Hao*_*Hao 20 c#

鉴于这种:

class InvoiceHeader {
    public int InvoiceHeaderId { get; set; }
    IList<InvoiceDetail> LineItems { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有一般方法来检测LineItems是否是可枚举类型?有些将使用其他可枚举类型(例如ICollection),而不是IList.

Mag*_*nus 46

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

if(typeof(Enumerable).IsAssignableFrom(p.PropertyType))
{
   System.Windows.Forms.MessageBox.Show(p.Name);
}
Run Code Online (Sandbox Code Playgroud)

或这个

if (p.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
{
    System.Windows.Forms.MessageBox.Show(p.Name);
}
Run Code Online (Sandbox Code Playgroud)

  • 回答我自己的问题 - 我应该使用`System.Collections.IEnumerable`,而不是`System.Collections.Generic.IEnumerable`. (5认同)
  • p.PropertyType.GetInterfaces().包含(typeof(IEnumerable))&& p.PropertyType!= typeof(String)或者String属性也将传递condigion (4认同)
  • 虽然它可能有点明显,但值得指出的是,字符串也是一种可枚举的类型.如果有人想要检查属性是否为_any_类型的列表或集合,则使用ICollection会更合适. (3认同)
  • 我不能让它工作,我得到`使用泛型类型'System.Collections.Generic.IEnumerable <T>'需要1个类型参数 (3认同)