确定派生类是否实现了将自身作为泛型参数的泛型接口

时间:2013-05-13 17:49:40

标签: c# .net generics reflection

我在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表示法是基于该接口使用的泛型类型的数量而增量的。

我要么以错误的方式去做这件事,要么在这里错过一些愚蠢的事情。请指教。

2 个答案:

答案 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