2

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

我要么以错误的方式解决这个问题,要么在这里错过了一些愚蠢的东西。请指教。

4

2 回答 2

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()
于 2013-05-13T18:00:14.870 回答
1

尝试:

 o.GetType().GetInterfaces()[0] == 
                   typeof(IKnownInterface<>).MakeGenericType(o.GetType())

http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx

于 2013-05-13T17:55:14.303 回答