enum.toString()如何在引擎盖下工作?

Jea*_*ent 6 c# enums tostring

我是一名iOS开发人员,我很遗憾在Objective-C中没有像C#中那样令人惊奇的方法来实现enum

所以我很想知道toString方法如何在C#中用于枚举.

也许有了你的答案,我将理解为什么Objective-C没有实现这个方法.

谢谢

Typ*_*eIA 9

C#编译器实际上将枚举转换为常规class类型,并通过结合语法糖和.NET框架中的方法(特别是TypeEnum类)的一些帮助使它们像枚举一样运行.

声明enum类型时实际发生的是编译器创建一个隐藏的,特别命名的类,其概念如下所示:

public sealed class EnumName : Enum
{
    public static readonly int FirstValue = 0;
    public static readonly int SecondValue = 1;
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

Enum基类是不能直接使用特殊的基类.它提供了ToString()方法.这引发了.NET框架内部的一系列函数调用.代码Type.GetEnumName()最终成为一个私有Type.GetEnumData()方法,它使用反射来检查EnumName类,查看其字段(枚举值)并获取并返回它们的名称.

调用图(按时间顺序)如下所示:

Enum.ToString()
  Enum.InternalFormat(RuntimeType, object)
    Enum.GetName(RuntimeType, object)
      Type.GetEnumName(object)
        Type.GetEnumRawConstantValues()
          Type.GetEnumData(out string[], out Array)
        Type.GetEnumNames()
          Type.GetEnumData(out string[], out Array)
Run Code Online (Sandbox Code Playgroud)

GetEnumData()调用Type.GetFields()并迭代它们,将每个字段的名称和整数值(枚举值)复制到输出数组中.