我正在尝试构建从用户字符串获取的通用函数,并尝试将其解析为枚举值,如下所示:

private Enum getEnumStringEnumType(Type i_EnumType)
    {
        string userInputString = string.Empty;
        Enum resultInputType;
        bool enumParseResult = false;

        while (!enumParseResult)
        {
            userInputString = System.Console.ReadLine();
            enumParseResult = Enum.TryParse(userInputString, true, out resultInputType);
        }
    }

但是我得到:
The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'TEnum' in the generic type or method 'System.Enum.TryParse<TEnum>(string, bool, out TEnum)    .

错误意味着我需要为resultInputType减去特定的Enum?
我怎样才能解决这个问题 ?
谢谢。

最佳答案

TryParse method具有以下签名:

TryParse<TEnum>(string value, bool ignoreCase, out TEnum result)
    where TEnum : struct

它具有通用类型参数TEnum,该参数必须是一个struct,用于确定要解析的枚举的类型。当您不显式提供(如您所做的那样)时,它将采用您提供的任何类型作为result参数,在您的情况下为Enum类型(而不是枚举本身的类型)。

请注意 Enum is a class(尽管它继承自ValueType),因此不满足TEnum是结构的要求。

您可以通过删除Type参数并为该方法提供一个通用类型参数来解决此问题,该参数具有与struct函数上的通用类型参数相同的约束(即TryParse)。

因此,请尝试将其命名为通用类型参数TEnum:
private static TEnum GetEnumStringEnumType<TEnum>()
    where TEnum : struct
{
    string userInputString = string.Empty;
    TEnum resultInputType = default(TEnum);
    bool enumParseResult = false;

    while (!enumParseResult)
    {
        userInputString = System.Console.ReadLine();
        enumParseResult = Enum.TryParse(userInputString, true, out resultInputType);
    }
    return resultInputType;
}

要调用该方法,请使用:
GetEnumStringEnumType<MyEnum>();

10-07 16:05
查看更多