我有一个包含一些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 ) ...
}
但它没有用。
我如何在这里获得房产?
答案 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<>));
}