鉴于此:
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。
答案 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
这在使用实体框架上下文时对我有用。