c#反射与枚举作为字符串

问题描述

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

   public enum MyEnum
   {
        happy=0,sad
   }

   public struct MyStruct
   {
        public MyEnum feelings;
        public int boopCounter;
   }

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

feelings=sad
boopCounter=12

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

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

            }

所以此代码有效,但仅当我的输入文本包含枚举的整数版本时才有效:

feelings=1
boopCounter=12

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

解决方法

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

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