我有一个对象。通常,它可以是longstring,因此为了简化代码,我们假设是这样。

我必须创建一个尝试将此对象转换为提供的枚举的方法。所以:

public object ToEnum(Type enumType, object value)
{
    if(enumType.IsEnum)
    {
        if(Enum.IsDefined(enumType, value))
        {
           var val = Enum.Parse(enumType, (string)value);
           return val;
        }
    }
    return null;
}

使用字符串,效果很好。使用数字会引起问题,因为枚举的默认基础类型是int,而不是long,而IsDefined抛出了ArgumentException

当然,我可以进行很多检查,转换或 try catch 。

我想要的是为此提供一个干净而小的代码。
有什么想法使它易读易懂吗?

最佳答案

在我看来,您实际上只想处理以下三种情况:

  • 输入已经是正确的类型
  • 字符串
  • 各种类型的整数

  • 我相信这会做您想要的有效输入:
    public object ToEnum(Type enumType, object value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        if (enumType == null)
        {
            throw new ArgumentNullException("type");
        }
        if (!enumType.IsEnum)
        {
            return false;
        }
        string valueString = value as string;
        if (valueString != null)
        {
            return Enum.IsDefined(enumType, value) ? Enum.Parse(enumType, valueString) : null;
        }
        if (value.GetType() == enumType)
        {
            return value;
        }
        // This appears to handle longs etc
        return Enum.ToObject(enumType, value);
    }
    

    但是,即使未定义的值也将返回正确类型的值。如果您不想这样做,请将最后一部分更改为:
    object candidate = Enum.ToObject(enumType, value);
    return Enum.IsDefined(enumType, candidate) ? candidate : null;
    

    另外,如果您传递浮点数或类似的数字,这仍将引发异常。如果您不希望这种行为,则需要拥有一组您确实希望接受的所有类型,然后首先进行检查。

    关于c# - 如何将任意对象转换为枚举?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21482295/

    10-12 21:34
    查看更多