我在SO上看到了类似问题的答案,但没有找到符合以下所有标准的答案。
当B继承自A:
时,如何确定B类是否符合以下条件?[B]
未实现任何[additional]
接口(通用或非通用)。[A]
实现了一个通用接口,它有自己的类型作为泛型参数?以下
object o = new SomeObject();
bool result = (o.GetType().GetInterfaces()[0] == typeof(IKnownInterface<???>));
// ??? should be typeof(o). How to achieve this?
我知道我可以从类似"NameSpace.ClassName+IKnownInterface'1[[SomeType, ModuleName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"
的类型中获取接口名称字符串,但这似乎不直观或安全。此外,'1
表示法是基于该接口使用的泛型类型的数量而增量的。
我要么以错误的方式去做这件事,要么在这里错过一些愚蠢的事情。请指教。
答案 0 :(得分:2)
这应该可以解决问题
//get the two types in question
var typeB = b.getType()
var typeA = typeB.BaseType;
var interfaces = typeA.GetInterfaces();
//if the length are different B implements one or more interfaces that A does not
if(typeB.GetInterfaces().length != interfaces.length){
return false;
}
//If the list is non-empty at least one implemented interface satisfy the conditions
return (from inter in interfaces
//should be generic
where inter.IsGeneric
let typedef = inter.GetGenericTypeDefinition()
//The generic type of the interface should be a specific generic type
where typedef == typeof(IKnownInterface<>) &&
//Check whether or not the type A is one of the type arguments
inter.GetGenericTypeArguments.Contains(typeA)).Any()
答案 1 :(得分:1)
尝试:
o.GetType().GetInterfaces()[0] ==
typeof(IKnownInterface<>).MakeGenericType(o.GetType())
http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx