繁体   English   中英

C#接口继承

[英]C# interface inheritance

鉴于:

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

这是获取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();

但是,由于接口IB仍未实现方法TestMethod() ,此操作仍将返回0。 接口IA可以。 如果IAIB均为类,则使用绑定标志将有效。 但是,在那种情况下,您得到的返回值为5。请不要忘记IA隐式派生自Object类!

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

查看此MSDN文章的社区内容部分。

将IA视为IB的接口,而不是其基础。

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

尝试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM