使用枚举作为字符串的 C# 反射

Sit*_*awk 1 c# system.reflection

我有一个包含枚举的结构:

public enum MyEnum
{
    happy = 0,
    sad
}

public struct MyStruct
{
    public MyEnum feelings;
    public int boopCounter;
}
Run Code Online (Sandbox Code Playgroud)

然后我得到一个结构及其内容的文本/字符串版本:

feelings = sad
boopCounter = 12
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个通用解析器,它可以生成具有正确填充字段的结构对象,而不必在每次结构更新时修改解析器。我使用反射总体上是成功的:

// Scan through each member of the structure, looking for a match
foreach (var field in typeof(MyStruct).GetFields(System.Reflection.BindingFlags.Instance |
                                                 System.Reflection.BindingFlags.NonPublic |
                                                 System.Reflection.BindingFlags.Public))
{
    if(field.Name == fieldNameFromText)
    {
        // This is the member we need to update. Treat enums differently
        var fld = typeof(MyStruct).GetField(field.Name);
        if(field.FieldType.IsEnum)
        {
            //fld.SetValue(s, Enum.ToObject(field.FieldType, valFromText));   // Didn't work

            fld.SetValue(s, Convert.ChangeType(Enum.ToObject(field.FieldType, Convert.ToInt32(valFromText)), field.FieldType)); // Worked, but only if integer version of enum is passed in
        }
        else
        {
            // Not an enum, parse directly.
            fld.SetValue(s, Convert.ChangeType(valFromText, field.FieldType));
        }
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这段代码可以工作,但只有当我的输入文本包含枚举的整数版本时它才有效:

feelings = 1
boopCounter = 12
Run Code Online (Sandbox Code Playgroud)

有没有办法让它与原始字符串枚举输入(“sad”)一起使用?如果可能的话,我想保持它的通用性(请注意我的代码在任何地方都没有专门调用“MyEnum”)。

Joh*_* Wu 5

是的,您可以使用Enum.Parse的非通用版本。

var fieldType = fld.FieldType;
if (fieldType.IsEnum)
{
    var valueToAssign = Enum.Parse(fieldType, valFromText);
    fld.SetValue(s, valueToAssign);
}
Run Code Online (Sandbox Code Playgroud)