如何使用反射来获取特定类型的通用列表

时间:2014-07-25 14:51:46

标签: c# reflection

如何使用.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; }
}

我想获取NameAddressContacts属性,因为它们都属于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>属性,只会选择NameAddress属性。

**更新**

我已经包含了这两个类,并且我还希望包含也来自Std&#39;的属性。

class Std
{
    public int id { get; set; }
}

class Value : Std
{
    public string Val { get; set; }
}

1 个答案:

答案 0 :(得分:3)

看起来很简单。试试这个:

var props = from p in this.GetType().GetProperties()
            where p.PropertyType == typeof(Value) ||
                  p.PropertyType == typeof(List<Value>)
            select new { Property = p };

或者处理ValueList<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 }; 的属性。