Pio*_*fer 5 c# enums type-conversion
我有一个对象.通常它是long或者string,所以为了简化代码,让我们假设它.
我必须创建一个方法,尝试将此对象转换为提供的枚举.所以:
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;
}
Run Code Online (Sandbox Code Playgroud)
使用字符串它很好.随着数字它会导致问题,因为一个默认基础类型是枚举int,而不是long和IsDefined抛出ArgumentException.
当然,我可以做很多检查,转换或尝试捕获.
我想要的是拥有一个干净而小巧的代码.任何想法如何使其可读和简单?
在我看来,你实际上只想处理三种情况:
我相信这将满足您想要的有效输入:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,即使对于未定义的值,也会返回正确类型的值。如果您不想这样做,请将最后一部分更改为:
object candidate = Enum.ToObject(enumType, value);
return Enum.IsDefined(enumType, candidate) ? candidate : null;
Run Code Online (Sandbox Code Playgroud)
另外,如果您传入浮点数或类似的数字,这仍然会引发异常。如果您不希望出现这种行为,则需要拥有一组您确实想要接受的所有类型,并首先进行检查。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |