Create enum using reflection

2019-05-07 16:32发布

问题:

Does C# offer a way to create Enum type from scratch using reflection?

Suppose, I have a collection of strings: {"Single", "Married", "Divorced"} and I'm willing to build the following enum type in runtime:

enum PersonStatus
{
    Single, Married, Divorced
}

Is this somehow possible?

回答1:

Not without doing really gnarly things like generating assemblies using Emit. How would you use such an enum anyway? Whats the real goal here?

EDIT: Now that we know what you really want to do, this page suggests that you can acheive your goal using code like the following:

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;
}


回答2:

Does C# offer a way to create Enum type from scratch using reflection?

Yes, it's possible. If you want to create types (including enums) at runtime you could use Reflection.Emit in order to emit the actual MSIL code.

Here's a concrete example of how to achieve that using the DefineEnum method.