将值解析为可为空的枚举

cor*_*ore 9 c# enums nullable

假设我有这个:

PriorityType? priority;
string userInput = ...;
Run Code Online (Sandbox Code Playgroud)

我无法改变PriorityType? priority它的定义:因为它实际上是与另一段代码的合同的一部分。

我试过这个,但它不起作用:

if (Enum.TryParse<PriorityType?>(userInput, out priority)) {
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法?

小智 13

如果你希望它是一行代码,你可以这样做:

var priority = Enum.TryParse<PriorityType>(userInput, out var outPriority) ? outPriority : (PriorityType?) null;
Run Code Online (Sandbox Code Playgroud)


Ron*_*yer 5

最简单的方法:

PriorityType tempPriority;
PriorityType? priority;

if (Enum.TryParse<PriorityType>(userInput, out tempPriority))
    priority = tempPriority;
Run Code Online (Sandbox Code Playgroud)

这是我能想到的最好的:

public static class NullableEnum
{
    public static bool TryParse<T>(string value, out T? result) where T :struct, IConvertible
    {
        if (!typeof(T).IsEnum)
            throw new Exception("This method is only for Enums");

        T tempResult = default(T);

        if (Enum.TryParse<T>(value, out tempResult))
        {
            result = tempResult;
            return true;
        }

        result = null;
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

用:

if (NullableEnum.TryParse<PriorityType>(userInput, out priority))
Run Code Online (Sandbox Code Playgroud)

上面的类可以像Enum.TryParse除了可以为空的输入之外一样使用。您可以添加另一个采用不可为空的重载函数,T以便您可以根据需要在这两种情况下使用它。不幸的是,扩展方法在枚举类型上不能很好地工作(就我尝试在短时间内尝试操作它而言)。