Я сделал следующий метод расширения ...
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 и присвоить ему значение, но я застрял на том, как именно это можно сделать.
У кого-нибудь есть идея или лучший способ решить эту проблему? Можно ли вообще это решить? Я довольно много искал по этому поводу, но ничего полезного не нашел.