从Generic Class获取ICollection类型的属性的列表

时间:2014-07-30 08:55:28

标签: c# .net system.reflection

我有一个包含一些ICollection类型属性的对象

所以基本上这个类看起来像这样:

Class Employee {

public ICollection<Address> Addresses {get;set;}

public ICollection<Performance> Performances {get; set;}

}

问题是通过使用反射来获取Generic类中ICollection类型的属性名称。

我的通用类是

Class CRUD<TEntity>  {

public object Get() {
 var properties = typeof(TEntity).GetProperties().Where(m=m.GetType() == typeof(ICollection ) ... 
}

但它没有用。

我如何在这里获得房产?

2 个答案:

答案 0 :(得分:8)

GetProperties()返回PropertyInfo[]。然后使用Where执行m.GetType()。如果我们假设您错过了>,这是m=>m.GetType(),那么您实际上是在说:

 typeof(PropertyInfo) == typeof(ICollection)

(警告:实际上,它可能是RuntimePropertyInfo等)

你的意思可能是:

typeof(ICollection).IsAssignableFrom(m.PropertyType)

然而!请注意ICollection&lt;&gt; ICollection<>&lt;&gt; ICollection<Address>等等 - 所以它甚至不那么容易。您可能需要:

m.PropertyType.IsGenericType &&
    m.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>)

确定;这有效:

static void Main()
{
    Foo<Employee>();
}
static void Foo<TEntity>() {
    var properties = typeof(TEntity).GetProperties().Where(m =>
        m.PropertyType.IsGenericType &&
        m.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>)
    ).ToArray();
    // ^^^ contains Addresses and Performances
}

答案 1 :(得分:2)

您可以使用IsGenericType并针对GetGenericTypeDefinition

检查typeof(ICollection<>)
public object Get()
{
    var properties =
        typeof (TEntity).GetProperties()
            .Where(m => m.PropertyType.IsGenericType && 
                    m.PropertyType.GetGenericTypeDefinition() == typeof (ICollection<>));
}