在c#中使用反射创建带有字符串值的未知枚举实例
本文关键字:字符串 未知 实例 枚举 创建 反射 | 更新日期: 2023-09-27 18:07:54
我有一个问题,弄清楚如何准确地创建一个枚举实例时,在运行时我有系统。enum的类型,并检查BaseType是否为System。枚举,我的值是一个int值,与神秘枚举中的项匹配。
到目前为止,我所拥有的代码只是上面描述的逻辑,如下所示。
if (Type.GetType(type) != null)
{
if (Type.GetType(type).BaseType.ToString() == "System.Enum")
{
return ???;
}
}
在过去使用枚举时,我总是在代码时知道我试图解析哪个枚举,但在这种情况下,我感到困惑,并且很少有运气以谷歌友好的方式表达我的问题…我通常会这样写
(SomeEnumType)int
,但因为我不知道在代码时间的枚举类型我怎么能实现同样的事情?
在Enum
类上使用ToObject
方法:
var enumValue = Enum.ToObject(type, value);
或者像你提供的代码:
if (Type.GetType(type) != null)
{
var enumType = Type.GetType(type);
if (enumType.IsEnum)
{
return Enum.ToObject(enumType, value);
}
}
使用(ENUMName)Enum.Parse(typeof(ENUMName), integerValue.ToString())
作为泛型函数(编辑以纠正语法错误)…
public static E GetEnumValue<E>(Type enumType, int value)
where E : struct
{
if (!(enumType.IsEnum)) throw new ArgumentException("Not an Enum");
if (typeof(E) != enumType)
throw new ArgumentException(
$"Type {enumType} is not an {typeof(E)}");
return (E)Enum.Parse(enumType, value.ToString());
}
旧版本错误:
public E GetEnumValue(Type enumType, int value) where E: struct
{
if(!(enumType.IsEnum)) throw ArgumentException("Not an Enum");
if (!(typeof(E) is enumType))
throw ArgumentException(string.format(
"Type {0} is not an {1}", enumType, typeof(E));
return Enum.Parse(enumType, value.ToString());
}