2011-02-16 50 views
1

问题是,Type.GetInterfaces()返回一个类实现的所有接口,这包括由继承的基类定义/实现的所有接口。当我试图找出一个类在本地引用/实现的接口(因此排除了在基类中引用/定义的任何接口)时,我遇到了问题。如何使用反射来确定本地类是否实现接口?

我想要做类似type.GetProperties()可以采取的BindingFlags的东西,所以下面的代码会得到那些类型内声明的所有公共/私有财产被引用(和所有属性中声明基类不包括在内)。

type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly) 

我试过以下,但它失败,因为“.DeclaringType”始终为空。

foreach (var implementedInterface in type.GetInterfaces()) 
{ 
    if (implementedInterface.DeclaringType == type) 
    { 
     locallyDefinedInterfaces.Add(implementedInterface); 
    } 
} 
+1

你为什么要这样做? – DJClayworth 2011-02-16 14:38:16

+0

@DJClayworth:你是否真的这么说:“你为什么要这样做,我可能会以另一种方式提出建议?”。它将帮助一些新的员工从头开始学习.NET和OO,这样他们就可以安全地对类进行修改,因为知道如果类定义不会改变,那么他们就可以从这个角度来看。我同意,断言/测试通常是矫枉过正的,但在这个例子中,已经决定这个级别的测试至少在短期内是有益的。在大多数情况下,这些测试只需要很短的时间就可以编写 – 2011-02-16 14:58:29

回答

2

你不能用它定义的所有接口填充集合。然后,对于每个从您的目标类派生的类开始的类,获取类实现的所有接口,随时从列表中删除。重复冲洗,直到你没有更多的基础班。无论您的列表中是什么,接口都只能由您的原始类实现。

注意:可能有更好的方法来做到这一点,这只是一个建议。

+1

我认为(但我不确定)你可以在你的代码不能处理的派生类中重新实现接口。 – CodesInChaos 2011-02-16 14:46:46

+0

@CodeInChaos:是的,这是正确的,你正在测试的类和基类可以引用相同的接口。这是一个痛苦,因为我也在考虑类似于@ Moo-Juice建议的回归方法。 – 2011-02-16 15:02:12

-1

如何使用is运算符来检查该类是否属于该类型。 e.g


class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass c = new MyClass(); 
      MyClass1 c2 = new MyClass1(); 

      var b = c is IInterface; 
      Console.WriteLine(b); //False 
      Console.WriteLine(c2 is IInterface); //True 
      Console.ReadKey(); 
     } 
    } 

    class MyClass 
    { 

    } 
    class MyClass1 : IInterface 
    { 

    } 
    interface IInterface 
    { 

    }
0

该声明的类型为NULL,则可能是因为它是空...(因为接口没有任何类型的内声明的)原因。只是一个见解

相关问题