gpt4 book ai didi

c# - Type.GetInterfaces() 仅用于声明的接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 23:09:50 24 4
gpt4 key购买 nike

首先,有很多这样的问题,也许有些 OP 甚至问过这个完全相同的问题。问题是这些问题的答案(接受与否)实际上没有回答这个问题,至少我找不到。

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

例如

interface I {}
interface W : I {}
class C : W {}
class D : C, I {}
class E : D {}

结果:

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

可接受的解决方案可能要求接口(interface)至少有一个方法。

如果您认为这真的不可能,请注意不要制作this。错误,实际上can完成。

InterfaceMap 处理很多情况,但不是全部(我在下面举了一个 InterfaceMap 无法解决的例子)。我有一个想法,但不知道如何实现它,就是反编译类的字节码并查看声明的内容,因为 ILSpy 等工具可以正确识别每种情况!如果您喜欢这个想法,请给我一个指向该领域更多信息的链接。

我希望你们中的一些人会建议我清理我的设计。如果这不是您的论点,那么本文的其余部分与您无关。

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

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。现在确定这是边缘情况,但它也是正确的答案。因此,我的引擎与潜在的用户代码不完全兼容。告诉用户清理他们的代码以便使用我的工具是 Not Acceptable 。 (请注意,还有许多关于转换为接口(interface)的有趣规则,但我不会在这里讨论它们)。

最佳答案

为给定类型声明的接口(interface),您可以使用GetInterfaces在给定的类型上,如果它有一个 BaseType你可以使用 Except枚举器以排除基类型的接口(interface)...

它未经测试,但也许像这种扩展方法...

public static IEnumerable<Type> GetDeclaredInterfaces(this Type t)
{
var allInterfaces = t.GetInterfaces();
var baseInterfaces = Enumerable.Empty<Type>();
if (t.BaseType != null)
{
baseInterfaces = t.BaseType.GetInterfaces();
}
return allInterfaces.Except(baseInterfaces);
}

关于c# - Type.GetInterfaces() 仅用于声明的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9793242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com