The*_*urf 1 c# generics enums casting nullable
我想将 int 值转换为可空枚举使用通用函数。我认为这很容易,尤其是所有关于 enum / int 转换的所有 SO。我发现的最接近的问题是this one,但不幸的是,它不处理可为空的枚举。 这个问题解决了 Nullable 枚举转换问题,但不能解决泛型问题。
这是我正在尝试做的一个简化示例:
public enum SouthParkCharacters
{
Stan = 0,
Kyle = 1,
Eric = 2,
Kenny = 3
}
public static T CastNullableEnum<T>(int value)
{
return (T)(object)((int?)value).Value;
}
public static T SomeFunction<T>(this int anyEnumValue)
{
SouthParkCharacters? spc = SouthParkCharacters.Kenny;
spc = CastNullableEnum<SouthParkCharacters>(3); //I am working!
spc = CastNullableEnum<SouthParkCharacters?>(3); //Raise error Specified cast is not valid.
//This function will be public so I won't have control over the T
T finalValue = CastNullableEnum<T>(anyEnumValue); //Raise error Specified cast is not valid.
return finalValue;
}
Run Code Online (Sandbox Code Playgroud)
正如您在最后一个函数中看到的,对不可为空的枚举的强制转换正在起作用。问题是我希望能够从其他泛型函数调用 CastNullableEnum,该函数可以使用可空枚举作为泛型类型。
我知道您可以将泛型类型作为可空泛型传递,CastNullableEnum<T?>但我们可以反其道而行之(即将可空基础类型传递给泛型函数)?
如果这不能完成,那么我想解决方案是找到在 CastNullableEnum 函数中转换枚举值的正确方法。
我可能读错了这个问题,买你可以从可空值中获取底层类型并使用Enum.Parse而不是直接转换。
public T CastNullableEnum<T>(int value)
{
var enumType = Nullable.GetUnderlyingType(typeof(T));
if (Enum.IsDefined(enumType, value))
{
return (T)(object)Enum.Parse(enumType, value.ToString());
}
return default(T);
}
var test1 = CastNullableEnum<SouthParkCharacters?>(3);
//returns Kenny
var test2 = CastNullableEnum<SouthParkCharacters?>(9);
// returns null
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4322 次 |
| 最近记录: |