使用下面的示例...如何确定属性是否属于实现泛型类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()的一些内容......
由于
答案 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
?”