Есть ли общий способ определить, является ли тип свойства перечислимым типом?

17

Учитывая это:

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.

    
задан Hao 26.06.2011 в 11:16
источник

3 ответа

38

Ваш код фактически не проверяет, являются ли свойства Enumerable , но если они являются типичными IList. Попробуйте следующее:

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

Или это

if (p.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
{
    System.Windows.Forms.MessageBox.Show(p.Name);
}
    
ответ дан Magnus 26.06.2011 в 11:25
источник
2
if (invoiceHeader.LineItems is IEnumerable) {
    // LineItems implements IEnumerable
}

Это не работает, если тип invoiceHeader неизвестен во время компиляции. В этом случае я хотел бы знать, почему нет общего интерфейса, потому что использование отражения для поиска свойства коллекции довольно сомнительно.

    
ответ дан mgronber 26.06.2011 в 11:24
источник
1

IEnumerable является базовым типом для всех типов Enumerable в C #, и, таким образом, вы можете проверить если свойство такого типа вообще.

Следует, однако, отметить, что C # является особенным в том, как он связывает синтаксис сахара (например, цикл foreach), который он связывает с методами (поэтому для полной проверки вы должны проверить, содержит ли свойство метод GetEnumerator (либо IEnumerable .GetEnumerator или IEnumerable.GetEnumerator)

    
ответ дан Yet Another Geek 26.06.2011 в 11:20
источник