我做了以下扩展方法......
public static class ObjectExtensions
{
public static T As<T>(this object pObject, T pDefaultValue)
{
if (pObject == null || pObject == DBNull.Value)
return pDefaultValue;
return (T) pObject;
}
}
...我用它来读取数据,如下所示:
string field = datareader["column"].As("default value when null")
但是当我想从装箱值转换为可为空的枚举时,它不起作用。我能想到的最好的就是这个(乱七八糟的 WIP 代码不起作用):
public static class ObjectExtensions
{
public static T As<T>(this object pObject, T pDefaultValue)
{
if (pObject == null || pObject == DBNull.Value)
return pDefaultValue;
var lType = typeof (T);
if (!IsNullableEnum(lType))
return (T) pObject;
var lEnumType = Nullable.GetUnderlyingType(lType);
var lEnumPrimitiveType = lEnumType.GetEnumUnderlyingType();
if (lEnumPrimitiveType == typeof(int))
{
var lObject = (int?) pObject;
return (T) Convert.ChangeType(lObject, lType);
}
throw new InvalidCastException();
}
private static bool IsNullableEnum(Type pType)
{
Type lUnderlyingType = Nullable.GetUnderlyingType(pType);
return (lUnderlyingType != null) && lUnderlyingType.IsEnum;
}
}
用法:
public enum SomeEnum {Value1, Value2};
object value = 1;
var result = value.As<SomeEnum?>();
当前错误是 InvalidCastException,当它尝试将 Int32 强制转换为可为空的枚举时。我猜这没问题,但我不知道我还能怎么做?我试图创建一个可为空的枚举 T 的实例并为其分配一个值,但我对如何做到这一点感到困惑。
任何人有想法或更好的方法来解决这个问题?甚至有可能以通用方式解决这个问题吗?我已经做了很多搜索,但我没有发现任何有用的东西。