2

我有一个包含List<T>. 其中一些属性,T 属于从 Class 继承的 Class,例如 Foo。

public class Foo {}
public class MyTypeA : Foo {}
public class MyTypeB : Foo {}

// Not : Foo
public class MyTypeC {}

public class Bar 
{
    // I can Match these
    public MyTypeA PropA { get; set; }
    public MyTypeB PropB { get; set; }

    // How can I match these based on IsSubclassOf(Foo)
    public List<MyTypeA> PropListA { get; set; }
    public List<MyTypeB> PropListB { get; set; }

    // Do not match the props below
    public MyTypeC PropC { get; set; }
    public List<MyTypeC> PropListC { get; set; }
    public List<string> PropListString { get; set; }

}    

我已经成功匹配了Foo如下所示的子类属性。

foreach (var oProp in T.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
    // Find Prop : Foo
    if( oProp.PropertyType.IsSubclassOf( typeof(Foo) ) )
    {
        // Add Property to dictionary
        aPropInheritType.Add(
            oProp.Name, 
            oProp
        );
    }

    // Match List<T>  where T : Foo
    // How do I test for Generic List that's Type T is a subclass 
    // of the class Foo ?

}

我看到有许多类型类的通用属性,但无法获取通用列表的类型,然后针对 IsSubclassOf(Foo) 进行测试。

4

2 回答 2

3

要测试属性是否具有返回类型List<T>,请使用以下代码:

Type returnType = oProp.PropertyType;
if(returnType.IsGenericType && 
   returnType.GetGenericTypeDefinition() == typeof(List<>) &&
   typeof(Foo).IsAssignableFrom(returnType.GetGenericArguments()[0]))
{
   //property is of type List<T>, where T is derived from Foo
}
于 2013-06-07T09:57:34.330 回答
1

这是我从 Microsoft 框架中偷来的一个小宝石(我认为它在 EF 二进制文件中)。

    private static Type GetTypeOfList(PropertyInfo changedMember)
    {
        var listType = from i in changedMember.PropertyType.GetInterfaces()
                       where i.IsGenericType
                       let generic = i.GetGenericTypeDefinition()
                       where generic == typeof (IEnumerable<>)
                       select i.GetGenericArguments().Single();
        return listType.SingleOrDefault();
    }

你只需要测试

    Type listType = ...
    var tInListType = GetTypeOfList(listType);
    return tInListType.IsAssignableFrom(typeof(Foo));
于 2013-06-07T09:57:15.010 回答