C#使用对象转换为枚举

swe*_*tfa 23 c# enums c#-4.0

这个问题涉及在通用方法中铸造枚举

鉴于枚举

public enum Crustaceans
{
    Frog = 1,
    Toad = 4
}
Run Code Online (Sandbox Code Playgroud)

我可以简单地创建我的枚举实例

short val = 4;
Crustaceans crusty = (Crustaceans) val;
Run Code Online (Sandbox Code Playgroud)

但是,如果

short val = 4;
object obj = (object) val;
Crustaceans crusty = (Crustaceans)obj;
Run Code Online (Sandbox Code Playgroud)

尝试执行crusty的初始化时抛出运行时异常.

任何人都可以解释为什么会这样,以及为什么做这样的事情是不合法的.

并不是说我真的想要做到这一点,但是当我试图通过泛型来实现类似的事情并且有效地发生了正在发生的事情时,我遇到了一个问题.即

public T dosomething<T>(short val) where T : new()
{
    T result = (T)(object) val;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

那么,我试图做的是有与枚举和非枚举(不是那么关键,但将是很好),可以设置为短值,而不抛出异常,实际上初始化正确的枚举值工作的通用功能.

Tig*_*ran 42

这样的事情可能对你有所帮助:

public T dosomething<T>(object o)
{
   T enumVal= (T)Enum.Parse(typeof(T), o.ToString());
   return enumVal;
}
Run Code Online (Sandbox Code Playgroud)

但这仅适用于枚举,因为明确的使用原因Enum.Parse(..)

并使用它,例如:

object o = 4;
dosomething<Crustaceans>(o);
Run Code Online (Sandbox Code Playgroud)

Toad你的情况下,这将返回.


Tal*_*gal 5

在某些情况下,您不能使用泛型(例如在 WPF 转换器中,当您将值作为 时object)。在这种情况下,您不能强制转换为,int因为枚举类型可能不是int. 这是没有泛型的通用方法。该示例在 WPF 转换器中给出,但里面的代码是通用的:

using System;
using System.Windows;
using System.Windows.Data;

.
.
.

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    var enumType = value.GetType();
    var underlyingType = Enum.GetUnderlyingType(enumType);
    var numericValue = System.Convert.ChangeType(value, underlyingType);
    return numericValue;
}
Run Code Online (Sandbox Code Playgroud)


haz*_*zik 5

如果整数类型装箱为对象,正确的转换方法是使用Enum.ToObject方法:

public T Convert<T>(object o)
{
   T enumVal= (T)Enum.ToObject(typeof(T), o);
   return enumVal;
}
Run Code Online (Sandbox Code Playgroud)