【发布时间】:2012-04-28 05:25:27
【问题描述】:
首先,有很多这样的问题,也许有些 OP 甚至问过同样的问题。问题是这些问题的答案(接受与否)实际上没有回答这个问题,至少我找不到。
如何确定一个类直接声明的接口,而不是由父类或声明的接口继承的接口?
例如
interface I {}
interface W : I {}
class C : W {}
class D : C, I {}
class E : D {}
结果:
-
C声明W -
D声明I -
E没有声明
可接受的解决方案可能要求接口至少具有一种方法。
如果您认为这确实是不可能的,请注意不要犯this 错误,实际上can 会这样做。
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())
正确的答案是2,但是如果你将E的声明改为不直接包含I,答案是1。现在确定这是边缘情况,但它也是正确的答案。因此,我的引擎与潜在的用户代码不完全兼容。告诉用户清理他们的代码以使用我的工具是不可接受的。 (请注意,还有许多有趣的关于强制转换为接口的规则,但我不会在这里讨论它们。
【问题讨论】:
-
问题底部的代码示例毫无意义。当您写
new E()时,您期望会发生什么? -
谢谢,已修复,E应该继承D
-
如果它真的是多余的,它不会改变测试的结果。
-
还有一个问题,当您说
Unfortunately (part of) my project's purpose is in tracing code paths without having to run the code时,这是否意味着您没有创建这些对象,而您的项目正在读取原始文本 .cs 文件? -
您想知道一个类重新实现了哪些接口?见blogs.msdn.com/b/ericlippert/archive/2011/12/08/…
标签: c# reflection