如何将任意对象转换为枚举?

时间:2014-01-31 14:21:29

标签: c# enums type-conversion

我有一个对象。通常它是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,而非longIsDefined会引发ArgumentException

当然,我可以做很多检查,转换或尝试。

我想要的是拥有一个干净而小巧的代码。 任何想法如何使其可读和简单?

2 个答案:

答案 0 :(得分:4)

我觉得你实际上只想处理三种情况:

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

我相信这会做你想要的有效输入:

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;

此外,如果传入浮点数或类似的内容,这仍然会引发异常。如果您不想要这种行为,您需要拥有一组想要接受的所有类型,并首先检查它。

答案 1 :(得分:0)

试试这个

public object ToEnum<T>(object value)
    {
        var type = typeof(T);

        if (type.IsEnum)
        {
            int numberVal;

            if (!int.TryParse(value.ToString(), out numberVal) && value.GetType() != typeof(string))
            {
                return null;
            }

            value = numberVal;

            if (Enum.IsDefined(type, value))
            {
                T result = (T)Enum.Parse(type, value.ToString());
                return result;
            }
        }
        return null;
    }