【问题标题】:Create enum using reflection使用反射创建枚举
【发布时间】:2012-01-23 21:56:26
【问题描述】:

C# 是否提供了一种使用反射从头开始创建Enum 类型的方法?

假设,我有一个strings:{"Single", "Married", "Divorced"} 的集合,并且我愿意在运行时构建以下枚举类型

enum PersonStatus
{
    Single, Married, Divorced
}

这有可能吗?

【问题讨论】:

  • enum是一个合约,在runtime创建它是什么意思?
  • @gdoron 枚举可以在运行时被解释和使用,因此在运行时发出它们当然不是不可能的,尽管 Chris 的回答在这种情况下真正有用。跨度>
  • @JonHanna。请告诉我一个需要它的场景,因为在这种场景中它不是!
  • @gdoron 我为什么要这样做?我说了可以,我说了这里不需要。
  • 如果您的对象只有有限数量的值,尤其是在值的数量相当少的情况下,则使用枚举。使用枚举的好处是在编译时已经检查过您没有为枚举类型的对象分配无效值。假设您有一些硬件,其参数的值数量有限,您只能在运行时检测到。使用 enumbuilder 您可以在编译时检查在运行时不会分配无效值,因为您只能将从 enumtype 获得的值分配为允许值

标签: c# reflection enums runtime


【解决方案1】:

如果没有做一些非常棘手的事情,比如使用 Emit 生成程序集。无论如何,您将如何使用这样的枚举?这里的真正目标是什么?

编辑:既然我们知道您真正想要做什么,this page 建议您可以使用如下代码实现您的目标:

private void listViewComplex_CellEditStarting(object sender, CellEditEventArgs e)
{
    // Ignore edit events for other columns
    if (e.Column != this.columnThatYouWantToEdit)
        return;

    ComboBox cb = new ComboBox();
    cb.Bounds = e.CellBounds;
    cb.Font = ((ObjectListView)sender).Font;
    cb.DropDownStyle = ComboBoxStyle.DropDownList;
    cb.Items.AddRange(new String[] { "Single", "Married", "Divorced" });
    cb.SelectedIndex = 0; // should select the entry that reflects the current value
    e.Control = cb;
}

【讨论】:

  • @嗯,我用的是ObjectListView控件,当值为enum时,它可以自动显示有用的编辑提示。我认为如果有一种简单的方法可以以编程方式生成它们,那将是一个不错的解决方案。
  • 谢谢,我自己已经实现了类似的东西(删除组合框)。 Reflection.Emit 似乎也是一个值得了解的好功能。
【解决方案2】:

C# 是否提供了一种使用反射从头创建 Enum 类型的方法?

是的,这是可能的。如果您想在运行时创建类型(包括枚举),您可以使用Reflection.Emit发出实际的 MSIL 代码。

这是一个concrete example,说明如何使用DefineEnum 方法实现这一目标。

【讨论】:

  • 什么是 Reflection.Emit 如果不是标准反射?
  • 这并不是 OP 真正需要的,但总有下一个人进入谷歌搜索 :)
  • Emit 是关于代码注入,reflection 也是关于可用数据操作。它们不同的。
  • @JonHanna,是什么让您认为这不是 OP 需要的代码?是什么让您认为回应句子Suppose, I have a collection of strings: {"Single", "Married", "Divorced"} and I'm willing to build the following enum type in runtime: 的唯一方法是使用反射发射并提供具体示例来说明如何做到这一点?当然,如果您认为我的答案是错误的,请随时对我的答案投反对票,除此之外,您还可以提供您认为正确的答案。很抱歉不得不这么说,但你的行为真的让我很生气。
  • @JonHanna,如果我误解了你的评论,我很抱歉。我的英文很差。当您说 Reflection.Emit 实际上是 Reflection 时,我完全同意您的第一条评论,这就是我更新答案的原因。再次为我的困惑感到抱歉。我觉得我完全误解了你对谷歌的评论。语言障碍:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2012-12-12
  • 2017-10-01
相关资源
最近更新 更多