【问题标题】:Nested enums with System.Reflection.Emit使用 System.Reflection.Emit 嵌套枚举
【发布时间】:2010-10-22 23:40:23
【问题描述】:

我想创建一个带有嵌套枚举的类。

public class Foo
{
    public enum Views
    {
    }
}

但是 System.Reflection.Emit.TypeBuilder 类没有 DefineNestedEnum,只有 DefinedNestedType。 ModuleBuilder.DefineEnum 存在,让我创建一个枚举,但我找不到让它嵌套的方法。我可以在不伪造的情况下创建枚举(即使用 EnumBuilder)吗?


我将我的解决方案移至下面的答案。

【问题讨论】:

    标签: c# reflection .net-3.5 reflection.emit


    【解决方案1】:

    请参阅this article 末尾的示例,这正是您想要的。 (您使用具有正确参数的 DefineNestedType)

    【讨论】:

    • 这和我说的有什么不同?继承自 System.Enum 的嵌套类型,其中定义了具有常量值的字段。但是,该 MSDN 示例似乎表明不支持创建嵌套枚举。
    • 重点是:这就是嵌套枚举——一种继承自 System.Enum 的嵌套类型,它定义了具有常量值的字段。在反射器中查看 MSDN 示例在其发出的程序集中生成的内容,并将其与通过使用嵌套枚举编译 C# 类生成的嵌套枚举进行比较,您会发现它们是相同的。
    • 再一次,您链接的 MSDN 文章与我最初在问题中发布的文章有何不同(并且已经移至答案)?我的问题不是关于如何伪造枚举(我显然已经涵盖了)。 EnumBuilder 的存在是为了掩盖枚举的所有细节,但我找不到任何方法来获取 EnumBuilder 并将其嵌套。
    • 您的问题询问您如何“不假装”做到这一点。该解决方案没有任何虚假,它产生了一个诚实的枚举。显然没有方便的方法使用 EnumBuilder 来做同样的事情,MS 通过给你稍微复杂的代码来实现相同的结果已经承认了这一点。
    【解决方案2】:

    将我提出的问题的答案移到此处。


    我唯一能想到的是将嵌套类型定义为扩展 System.Enum 的密封类并定义具有常量值的公共|静态|文字字段。这本质上是 C# 编译器根据我通过反汇编学到的东西所做的。如果我这样做并引用程序集,Intellisense 会将其识别为枚举并且功能就像枚举一样。


    这正是 MSDN 显示 Jeremy 链接的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多