具有继承接口的抽象类-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);
}
这些方法是显式实现的。
要在GetMethods()
中看到它们,您需要通过BindingFlags.NonPublic
。
IConvertable是显式实现的。这意味着,如果要访问IConvertibe成员,则必须将该枚举成员强制转换为IConvertite。这是一个示例:
static void Main()
{
Console.WriteLine((X.Y as IConvertible).GetTypeCode());
}
public enum X
{
Y,
Z
}