如何确定类型是否实现了泛型基类

时间:2014-08-18 10:38:29

标签: c# generics

使用下面的示例...如何确定属性是否属于实现泛型类Foo的类型?

public class Foo<TBaz>
{

}

public class Bar
{
    public Foo<int> FooInt { get; set; }
    public Foo<string> FooString { get; set; }
    public double SomeOther { get; set; }

    public int GetFooCount()
    {
        return typeof(Bar).GetProperties().Where(p => p.GetType().IsGenericType).Count();
    }
}

如果我想查找Foo<int>,那会很容易,但我怎样才能知道它是否包含Foo<int>Foo<double>等?

到目前为止,我已经写了GetFooCount()的一些内容......

由于

1 个答案:

答案 0 :(得分:2)

return typeof(Bar).GetProperties().Where(p => p.PropertyType.IsGenericType
    && p.PropertyType.GetGenericTypeDefinition() == typeof(Foo<>)).Count();

注意:这不会自动适用于class NonGenericSubtype : Foo<Blah> {...},也不适用于class GenericSubtype<T> : Foo<T> {...} - 如果您需要处理这些内容,它会变得更有趣。

对于更一般的情况,您需要在类型上使用递归的东西:

public static int GetFooCount()
{
    return typeof(Bar).GetProperties()
        .Count(p => GetFooType(p.PropertyType) != null);
}

private static Type GetFooType(Type type)
{
    while(type != null)
    {
        if (type.IsGenericType &&
            type.GetGenericTypeDefinition() == typeof(Foo<>))
                return type.GetGenericArguments()[0];
        type = type.BaseType;
    }
    return null;
}

请注意,这也回答“我现在如何找到T?”