c# 以枚举作为字符串的反射
c# reflections with enum as string
我有一个包含枚举的结构:
public enum MyEnum
{
happy=0,
sad
}
public struct MyStruct
{
public MyEnum feelings;
public int boopCounter;
}
然后我得到一个 text/string 版本的结构及其内容:
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 );
}
我有一个包含枚举的结构:
public enum MyEnum
{
happy=0,
sad
}
public struct MyStruct
{
public MyEnum feelings;
public int boopCounter;
}
然后我得到一个 text/string 版本的结构及其内容:
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 );
}