【问题标题】:C# interface inheritanceC#接口继承
【发布时间】:2011-03-24 15:16:35
【问题描述】:

给定:

public interface IA
{
    void TestMethod();
}

public interface IB : IA
{
}

为什么:

typeof(IB).GetMethods().Count() == 0;

?

要明确一点:

public class A
{
    public void TestMethod()
    {
    }
}

public class B : A
{
}

typeof(B).GetMethods().Count();

确实有效(返回 5);

作为奖励:

typeof(IB).BaseType == null

【问题讨论】:

    标签: c# reflection inheritance interface


    【解决方案1】:

    这是获取 IA 和 IB 计数的代码:

    var ibCount = typeof(IB).GetMethods().Count(); // returns 0
    var iaCount = typeof (IB).GetInterfaces()[0].GetMethods().Count(); // return 1
    

    请注意,在生产代码中我不会像通常在我会使用它的代码中那样使用GetInterfaces()[0],我不能假设我将始终拥有至少一个接口。

    我还尝试了如下绑定标志:

    const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy;
    var ibCount = typeof(IB).GetMethods(bindingFlags).Count();
    

    但是,这仍然会返回 0,因为接口 IB 仍然没有实现方法 TestMethod()。接口IA 可以。如果 IAIB 都是类,则使用绑定标志将起作用。然而,在这种情况下,您得到的返回值为 5。不要忘记 IA 隐式派生自类 Object

    【讨论】:

    • 感谢您的回答。我知道我可以遍历接口并从中获取方法。我的问题是为什么我不能那样做。
    【解决方案2】:

    这似乎是 GetMethods 函数的设计。它不支持接口中的继承成员。如果你想发现所有的方法,你需要直接查询每个接口类型。

    查看this MSDN article的社区内容部分。

    【讨论】:

      【解决方案3】:

      认为 IA 是 IB 的接口,而不是它的基础。

      【讨论】:

        【解决方案4】:

        您必须在 GetMethods() 中定义一些 Bindingflags。

        试试

        typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count();
        

        【讨论】:

        • 我已经省略了 BindingFlags,因为它们没有帮助 ;)。
        • 绑定标志在这种情况下没有帮助。当涉及到课程时,他们会提供帮助。
        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 2017-07-23
        • 2011-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        相关资源
        最近更新 更多