仅用于声明的接口的Type.GetInterfaces()

pay*_*ayo 5 c# reflection

首先,有很多这样的问题,也许有些OP甚至都在问这个完全相同的问题.问题是这些问题的答案(接受与否)都没有回答这个问题,至少没有我能找到的问题.

如何确定一个类直接声明的接口,而不是由父类或声明的接口继承的接口?

例如

interface I {}
interface W : I {}
class C : W {}
class D : C, I {}
class E : D {}
Run Code Online (Sandbox Code Playgroud)

结果:

  1. C 声明 W
  2. D 声明 I
  3. E 宣布无

可接受的解决方案可能要求接口至少具有一种方法.

如果您认为这是不可能的,请注意不要犯这个错误,这实际上可以做到.

InterfaceMap处理许多案件,但不是所有的(我给由下面不可解的例子InterfaceMap).我有一个想法,但不知道如何实现它,是反编译类的字节码,看看声明什么,因为ILSpy等工具正确识别每个案例!如果你喜欢这个想法,请给我一个链接到这个领域的更多信息.

我希望有些人会建议我清理我的设计.如果这不是您的论点,那么帖子的其余部分与您无关.

我项目的一部分目的是跟踪给定类型的潜在代码路径(在运行时).为了以编程方式确定将在目标类型上调用哪个方法,而不实际调用该方法或创建目标类型的实例,知道目标类型的声明接口是确定性地解决此问题的必要条件."不,"你说?考虑:

interface I { int Foo(); }
class C : I { public int Foo() { return 1; } }
class D : C { public new int Foo() { return 2; } }
class E : D, I { }

C p = new E();
Assert.AreEqual(1 or 2, (p as I).Foo())
Run Code Online (Sandbox Code Playgroud)

正确答案是2,但如果您将声明更改E为不I直接包含,答案是1.现在确定这是边缘情况,但它也是正确的答案.因此,我的引擎与潜在的用户代码不完全兼容.告诉用户清理他们的代码以便使用我的工具是不可接受的.(注意,有很多有趣的规则可以转换为接口,但我不会在这里讨论它们).

pay*_*ayo 4

根据评论中的有用信息,我能够明确地表明,这不能通过 msft 反射来完成(尽管可以通过 mono.cecil 来完成)。原因是GetInterfaces调用进行了本机调用,该调用返回针对目标类型预先扁平化的接口。