具有继承接口的抽象类-System.Enum实现了IConvertable,但MethodInfo.GetMethods

本文关键字:IConvertable GetMethods MethodInfo 实现 Enum 继承 接口 -System 抽象类 | 更新日期: 2023-09-27 18:21:45

我搜索了ECMA CLR标准和MSDN,更不用说我的几本.NET/CLR书了,包括Jeffrey Richter的CLR via C#和Sergey Lidin的Expert.NET IL Assembler,以了解我所看到的内容。

我知道System.Enum是一个抽象类,所以它可能有没有实现的抽象方法,但我不清楚的是实现接口的抽象类的语义。我一直明白,任何继承接口的类都必须实现该接口,无论该类是抽象的还是具体的。

里希特的书中也提到:

任何继承…的类。。。接口还必须实现接口定义的方法

特别是System.Enum让我感到困惑,因为根据MSDN,它实现了IConvertable

http://msdn.microsoft.com/en-us/library/system.enum(v=vs.110).aspx

一个例子是ToInt32(),注释说:使用Convert执行转换

http://msdn.microsoft.com/en-us/library/bb468863(v=vs.110).aspx

但我无法通过反思找到这些方法。

作为背景,我的编译器从.NET内置程序集(mscorlib.dll、System.dll等)中提取所有类型信息。

本周,我切换开关,开始解析和检查接口实现。我一这么做,它就开始抱怨类System.Enum的接口方法没有实现。起初我以为我已经以某种方式过滤掉了这些方法,但我在没有任何条件限制的情况下测试了代码,这些方法没有出现。

MSDN说System.Enum实现了IConvertable。MSDN在System.Enum下显示了这些方法。但从我的编译器输出的mscorlib的类型签名来看,Enum不包含ToChar()、ToBool()、ToInt16、ToInt32()或除ToString(IFormatProvider提供程序)之外的任何其他方法。我本以为可能会在那里看到抽象的方法,但话说回来,我并没有太大的期望,因为我不明白在这种情况下应该看到什么。

要么我缺少这些带有反射的方法,要么它们不存在,要么我不理解CLR或C#的这一方面(我的编译器不是C#编译器,但它符合CTS,并通过用C#编写的小型实用程序使用标准反射API)。

代码部分很简单。DisplayMethod负责格式化方法声明,但不过滤或限制输出。

MethodInfo[] methods = t.GetMethods();
foreach (MethodInfo m in methods)
{
    if (m.DeclaringType != t) continue;
    if (m.IsSpecialName) continue; // property getters/setters fall under here
    DisplayMethod(m);
}

具有继承接口的抽象类-System.Enum实现了IConvertable,但MethodInfo.GetMethods

这些方法是显式实现的。

要在GetMethods()中看到它们,您需要通过BindingFlags.NonPublic

IConvertable是显式实现的。这意味着,如果要访问IConvertibe成员,则必须将该枚举成员强制转换为IConvertite。这是一个示例:

 static void Main()
    {
        Console.WriteLine((X.Y as IConvertible).GetTypeCode());
    }
public enum X
{
    Y,
    Z
}