C# 如何使用反射来确定类是否在本地实现接口?

C# 如何使用反射来确定类是否在本地实现接口?,c#,reflection,C#,Reflection,问题是Type.GetInterfaces()返回类实现的所有接口,这包括由继承基类定义/实现的任何接口。当我试图找出一个类本地引用/实现的接口时,我遇到了问题(因此排除了基类中引用/定义的任何接口) 我想做一些类似于type.GetProperties()的事情,它可以接受BindingFlags,因此下面的代码将获取在被引用的类型内声明的所有公共/私有属性(并且排除在基类中声明的所有属性) 我尝试了以下操作,但失败了,因为“.DeclaringType”始终为空 foreach (var i

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

我想做一些类似于type.GetProperties()的事情,它可以接受BindingFlags,因此下面的代码将获取在被引用的类型内声明的所有公共/私有属性(并且排除在基类中声明的所有属性)

我尝试了以下操作,但失败了,因为“.DeclaringType”始终为空

foreach (var implementedInterface in type.GetInterfaces())
{
    if (implementedInterface.DeclaringType == type)
    {
        locallyDefinedInterfaces.Add(implementedInterface);
    }
}
看这里:


这是杰出的Daniel Cazzulino的文章。

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


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

如何使用
is
操作符检查类是否属于该类型。 e、 g


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

你到底为什么要这样做?@DJClayworth:你的意思是,“你为什么要这样做,我也许可以建议另一种方法?”。这是为了帮助一些从零开始学习.NET和OO的新员工,这样他们就可以安全地对类进行更改,因为他们知道,如果类定义没有更改,那么从这个角度来看,它们是可以的。我同意断言/测试这一点通常是过分的,但在这个例子中,团队已经决定,至少在短期内,这种测试水平是有益的。在大多数情况下,这些测试只花了很短的时间就完成了写操作,无法解决不报告基类实现的接口的问题。我认为(但我不确定)您可以在派生类中重新实现您的代码无法处理的接口。@CodeInChaos:Yes,这是正确的,您正在测试的类和基类都可以引用相同的接口。这是一种痛苦,因为我也在考虑一种类似@Moo Juice建议的复发方法。是的,这也是我得出的结论,我添加它是为了完整性,因为它是我运行的一个测试。URL目前不工作,连接超时。我稍后再查。
foreach (var implementedInterface in type.GetInterfaces())
{
    if (implementedInterface.DeclaringType == type)
    {
        locallyDefinedInterfaces.Add(implementedInterface);
    }
}

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
    {

    }