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

时间:2011-02-16 14:33:08

标签: c# reflection

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

4 个答案:

答案 0 :(得分:2)

您是否可以使用它定义的所有接口填充集合。然后,对于从目标类派生的每个类开始的每个类,获取 类实现的所有接口,随时从列表中删除。重复和冲洗,直到你没有更多的基类。您的列表中剩余的是接口,仅由您的原始类实现。

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

答案 1 :(得分:1)

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

如何使用 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
    {

    }