假设我有这个:
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)
最简单的方法:
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以便您可以根据需要在这两种情况下使用它。不幸的是,扩展方法在枚举类型上不能很好地工作(就我尝试在短时间内尝试操作它而言)。