C# 使用反射创建枚举

C# 使用反射创建枚举,c#,reflection,enums,runtime,C#,Reflection,Enums,Runtime,C#是否提供了一种使用反射从头开始创建Enumtype的方法 假设我有一组字符串:{“单身”、“已婚”、“离婚”},我愿意在运行时构建以下枚举类型: 这是可能的吗?如果不使用Emit生成程序集等非常棘手的事情,这是不可能的。您将如何使用这样的枚举?这里的真正目标是什么 编辑:现在我们知道了您真正想要做什么,建议您可以使用以下代码实现您的目标: private void listViewComplex_CellEditStarting(object sender, CellEditEventArg

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

假设我有一组
字符串
{“单身”、“已婚”、“离婚”}
,我愿意在运行时构建以下枚举类型:


这是可能的吗?

如果不使用Emit生成程序集等非常棘手的事情,这是不可能的。您将如何使用这样的枚举?这里的真正目标是什么

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

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;
}
C#是否提供了一种使用反射从头创建枚举类型的方法

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


下面介绍了如何使用
DefineEnum
方法实现这一点。

@我使用的是
ObjectListView
控件,当值为
enum
时,它可以自动显示有用的编辑提示。我认为,如果有一种简单的方法以编程方式生成它们,这将是一个很好的解决方案。谢谢,我自己已经实现了类似的东西(删除combobox)。另外,
Reflection.Emit
似乎是一个很好的特性。
enum
是一个契约,在运行时创建它的意义是什么?@gdoron enum可以在运行时解释和使用,因此在运行时发出它们肯定是有价值的,尽管克里斯的回答击中了在这种情况下什么才是真正有用的。@JonHanna。请给我看一个需要它的场景,因为在这个场景中它不是@格多龙,我为什么要这么做?我说过这是可以做到的,我说过这里不需要。如果对象只有有限数量的值,尤其是值的数量非常小,则使用枚举。使用枚举的好处在于,在编译时,已经检查了没有为枚举类型的对象指定无效值。假设您有一些硬件,其参数的值数量有限,只能在运行时检测到。使用enumbuilder,您可以在编译时检查运行时是否不会分配无效值,因为您只能将从enumtype获得的值分配为允许的值what's Reflection.如果不是标准反射,则发出?而不是OP实际需要的值,但在谷歌搜索中总会有下一个人出现:)
Emit
是关于代码注入的,
reflection
也是关于可用数据操作的。他们是不同的。@JonHanna,是什么让你认为这不是OP需要的代码?是什么让您认为响应句子
的唯一方法假设我有一个字符串集合:{“Single”、“marred”、“dis离”},并且我愿意在运行时构建以下枚举类型:
是使用反射emit,并提供一个具体的示例说明如何做到这一点?当然,如果你认为我的答案是错误的,请随意否决我的答案,此外,你还可以提供你认为正确的答案。很抱歉不得不这么说,但你的行为真的让我很生气。@JonHanna,如果我误解了你的评论,很抱歉。我的英语很差。我完全同意你的第一个评论,当你说反射。发射实际上是反射,这就是为什么我更新了我的答案。再次为我的困惑感到抱歉。我觉得我完全误解了你对谷歌的评论。语言障碍:-)
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;
}