在 C# 中将 Int 转换为通用的 Nullable Enum

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 函数中转换枚举值的正确方法。

sa_*_*213 7

我可能读错了这个问题,买你可以从可空值中获取底层类型并使用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)