我不确定这里的确切术语。基本上,如果我有一个类似的模型:
class Student : IDoSchool {}
class Freshman : Student {}
interface IDoSchool {}
什么代码会告诉我,Freshman没有直接实现任何接口,学生直接实现IDoSchool?
换句话说(无视不好的术语)我想要这样的东西:
typeof(Freshman).GetInterfaces(BindingFlags.DeclaredOnly); // nothing
typeof(Student).GetInterfaces(BindingFlags.DeclaredOnly); // IDoSchool
思想?
答案 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