如何使用.NET反射来获取特定类的属性列表,包括通用列表,例如我有一个看起来像这样的课程:
class Test
{
[NotConditional()]
[Order( 1 )]
public Value Name { get; set; }
[NotConditional()]
[Order( 2 )]
public Value Address { get; set; }
[NotConditional()]
[Order( 3 )]
public List<Value> Contacts { get; set; }
}
我想获取Name
,Address
和Contacts
属性,因为它们都属于Value
类型。
我有以下代码,效果很好,但我希望List<>
位只能获取List<Value>
属性。
var props = from p in this.GetType().GetProperties()
where p.PropertyType.IsSubclassOf( typeof( Std ) ) ||
( p.PropertyType.IsGenericType &&
p.PropertyType.GetGenericTypeDefinition() == typeof( List<> ) )
select new { Property = p };
我试过了:
var props = from p in this.GetType().GetProperties()
where p.PropertyType.IsSubclassOf( typeof( Std ) ) ||
( p.PropertyType.IsGenericType &&
p.PropertyType.GetGenericTypeDefinition() == typeof( List<Value> ) )
select new { Property = p };
但是,它不会选择任何List<Value>
属性,只会选择Name
和Address
属性。
**更新**
我已经包含了这两个类,并且我还希望包含也来自Std
&#39;的属性。
class Std
{
public int id { get; set; }
}
class Value : Std
{
public string Val { get; set; }
}
答案 0 :(得分:3)
看起来很简单。试试这个:
var props = from p in this.GetType().GetProperties()
where p.PropertyType == typeof(Value) ||
p.PropertyType == typeof(List<Value>)
select new { Property = p };
或者处理Value
或List<Value>
var props = from p in this.GetType().GetProperties()
where typeof(Value).IsAssignableFrom( p.PropertyType ) ||
typeof(List<Value>).IsAssignableFrom( p.PropertyType )
select new { Property = p };
鉴于您的更新,如果您想获取其类型可从Std
分配的任何属性,或者是一个可从Std
分配参数的列表,那么因为{{{{}}有点困难相对于List<T>
,1}} invariant。如果这就是你想要的,你可以这样做:
T
请注意,此版本不会返回其类型继承自var props = from p in this.GetType().GetProperties()
where typeof(Std).IsAssignableFrom( p.PropertyType ) ||
( p.PropertyType.IsGenericType &&
p.PropertyType.GetGenericTypeDefinition() == typeof(List<>) &&
typeof(Std).IsAssignableFrom( p.PropertyType.GetGenericArguments()[0] ) )
select new { Property = p };
的属性。