枚举类型的接口时,如何只获取直接继承的接口?

时间:2009-02-11 15:48:38

标签: c# .net reflection

我不确定这里的确切术语。基本上,如果我有一个类似的模型:

class Student : IDoSchool {}
class Freshman : Student {}
interface IDoSchool {}

什么代码会告诉我,Freshman没有直接实现任何接口,学生直接实现IDoSchool?

换句话说(无视不好的术语)我想要这样的东西:

typeof(Freshman).GetInterfaces(BindingFlags.DeclaredOnly); // nothing
typeof(Student).GetInterfaces(BindingFlags.DeclaredOnly); // IDoSchool

思想?

4 个答案:

答案 0 :(得分:1)

我怀疑界面的语义与你想要做的事情不一致。

接口只是说一个类必须实现一个成员列表。该类继承了接口,但是实现从父级继承的接口仍然是子类的责任。大多数情况下,父级已经提供了一个实现,所以我们倾向于认为接口实现与继承相同,但它们实际上是完全不同的概念。

在您的情况下,您可以做的最好的事情是使用GetInterfaceMap()检索接口映射,并确保接口的每个memeber的所有实现都来自父级,而不是来自子级。这是你能做的最好的事情,但是,它仍然不会完全按你要做的去做。

此外,在您的情况下是否可以使用完全抽象的类而不是接口?你不能做多重继承,但也许你的所有规则都意味着一个非常线性的继承?

答案 1 :(得分:0)

只是一个想法......

您可以获取类的接口和基类的接口。 然后得到差异。

修改

我检查过这个想法,有效:

public static Type[] GetDirectInterfaces(Type type)
{
    if (type.BaseType == null)
        return type.GetInterfaces();
    Type[] BaseInterfaces = type.BaseType.GetInterfaces();
    Type[] ThisInferfaces = type.GetInterfaces();
    return ThisInferfaces.Except(BaseInterfaces).ToArray();
}

如果接口数量巨大且执行时间至关重要,您可以使用字典创建一个单独的静态类来缓存结果。

答案 2 :(得分:0)

很抱歉发布这个作为答案,这实际上更多的是一个想法和建议,但它不适合评论......

如果您遇到以下情况该怎么办:

interface IA{
    void foo();
}
class CA : IA{
    public void foo(){
        Console.Writeline("Class A");
    }
}
class CB : CA, IA{
    public new void foo(){
        Console.Writeline("Class B");
    }
}

我猜CB应该在'直接实现的接口'中返回IA,但是如果你将CB与CA进行比较,你会发现它们实现了相同的接口,因此找不到差异的方法是行不通的。
在疯狂寻找解决方案之前,您是否尝试过查看MSIL或从Reflector反编译的代码,看看这是否可行?

答案 3 :(得分:0)

 typeof("the object").GetInterfaces().Count==0