代码之家  ›  专栏  ›  技术社区  ›  Marc Gravell

将整数转换为仅在运行时已知的装箱枚举类型

  •  39
  • Marc Gravell  · 技术社区  · 16 年前

    假设我们有一个枚举:

    enum Foo { A=1,B=2,C=3 }
    

    如果类型在编译时已知,则可以使用直接强制转换在枚举类型和基础类型(通常是 int ):

    static int GetValue() { return 2; }
    ...
    Foo foo = (Foo)GetValue(); // becomes Foo.B
    

    这是一个盒子的类型 Foo

    object o1 = foo;
    Console.WriteLine(o1.GetType().Name); // writes Foo
    

    (事实上,你可以把盒子当作 拆箱 内景 内景 拆箱

    然而 内景 -但我能把它当作盒子吗 ? (理想情况下不使用泛型和 MakeGenericMethod Convert.ChangeType 引发异常。 ToString Enum.Parse 工作,但 可怕的

    我可以看看定义的值( Enum.GetValues Type.GetFields )但这对我来说很难 [Flags] ,即使没有,也需要首先返回底层类型(谢天谢地,这并没有那么难)。

    但是;从正确的基础类型的值到枚举类型的框(该类型仅在运行时已知)是否有更直接的方法?

    2 回复  |  直到 16 年前
        1
  •  82
  •   aaronb    16 年前

    我认为 Enum.ToObject 方法会做你想做的事。

    Type type= typeof(Foo);
    object o1 = Enum.ToObject(type,GetValue());
    
        2
  •  8
  •   Community Mohan Dere    8 年前

    我只是想给你添点东西 @aaronb's answer :我必须对一些自动映射代码执行此操作,并发现我需要执行一些检查才能使代码适用于任意类型。特别是,空值和可空枚举会让您头疼。

    目前我掌握的最简单的代码是:

    static object CastBoxedValue(object value, Type destType)
    {
        if (value == null)
            return value;
    
        Type enumType = GetEnumType(destType);
        if (enumType != null)
            return Enum.ToObject(enumType, value);
    
        return value;
    }
    
    private static Type GetEnumType(Type type)
    {
        if (type.IsEnum)
            return type;
    
        if (type.IsGenericType)
        {
            var genericDef = type.GetGenericTypeDefinition();
            if (genericDef == typeof(Nullable<>))
            {
                var genericArgs = type.GetGenericArguments();
                return (genericArgs[0].IsEnum) ? genericArgs[0] : null;
            }
        }
        return null;
    }
    

    推荐文章