【问题标题】:How to use reflection to determine if a class locally implements an interface?如何使用反射来判断一个类是否在本地实现了一个接口?
【发布时间】:2011-02-16 14:33:08
【问题描述】:

问题在于 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);
    }
}

【问题讨论】:

  • 你到底为什么要这样做?
  • @DJClayworth:你的意思是,“你为什么要这样做,然后我可以建议另一种方式?”。这是为了帮助一些从头开始学习 .NET 和 OO 的新员工,这样他们就可以安全地对类进行更改,因为他们知道如果类定义没有改变,那么从这个角度来看他们是可以的。我同意断言/测试这一点通常是矫枉过正的,但在这种情况下,在团队中已经决定这种级别的测试至少在短期内是有益的。在大多数情况下,这些测试只花了很短的时间来编写

标签: c# reflection


【解决方案1】:

你能不能用它定义的所有接口来填充一个集合。然后,对于从目标类派生的类开始的每个类,获取 那个 类实现的所有接口,并从列表中删除。重复和冲洗,直到你没有更多的基类。列表中剩下的都是由原始类单独实现的接口。

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

【讨论】:

  • 我认为(但我不确定)您可以在派生类中重新实现您的代码无法处理的接口。
  • @CodeInChaos:是的,您正在测试的类和基类都可以引用相同的接口。这很痛苦,因为我也在考虑类似于@Moo-Juice 建议的递归方法。
【解决方案2】:

【讨论】:

  • URL 目前不工作,连接超时。稍后再检查。
【解决方案3】:

声明类型为null的原因,可能是因为它为null...(因为接口没有在任何类型中声明)。只是一个见解

【讨论】:

  • 是的,这几乎也是我得出的结论,我添加它是为了完整性,因为它是我要运行的测试。
【解决方案4】:

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


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
    {

    }

【讨论】:

  • 没有解决基类实现的接口不上报的问题。
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2013-11-07
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多