在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

,但因为我不知道在代码时间的枚举类型我怎么能实现同样的事情?

在c#中使用反射创建带有字符串值的未知枚举实例

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