Ram*_*ami 30 c# generics enums
我正在尝试构建从用户字符串获取的泛型函数,并尝试将其解析为Enum valuse,如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到:
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) .
Run Code Online (Sandbox Code Playgroud)
错误意味着我需要为resultInputType转换特定的枚举?我怎样才能解决这个问题 ?谢谢.
Dan*_*ker 50
该TryParse
方法具有以下特征:
TryParse<TEnum>(string value, bool ignoreCase, out TEnum result)
where TEnum : struct
Run Code Online (Sandbox Code Playgroud)
它有一个泛型类型参数TEnum
,必须是一个struct,用于确定要解析的枚举类型.当你没有明确地提供它时(正如你所做的那样),它将采用你提供的任何类型作为result
参数,在你的情况下是类型Enum
(而不是枚举本身的类型).
请注意,这Enum
是一个类(尽管它继承自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;
}
Run Code Online (Sandbox Code Playgroud)
要调用该方法,请使用:
GetEnumStringEnumType<MyEnum>();
Run Code Online (Sandbox Code Playgroud)
你应该制作一个通用的方法:
private T getEnumStringEnumType<T>() where T : struct, IConvertible
{
string userInputString = string.Empty;
T resultInputType = default(T);
bool enumParseResult = false;
while (!enumParseResult)
{
userInputString = System.Console.ReadLine();
enumParseResult = Enum.TryParse<T>(userInputString, out resultInputType);
}
return resultInputType;
}
Run Code Online (Sandbox Code Playgroud)
用法:
public enum myEnum { val1, val2 }
myEnum enumValue = getEnumStringEnumType<myEnum>();
Run Code Online (Sandbox Code Playgroud)
很久以前,在 Visual Studio 2005 时代,我在 Enum 上创建了自己的 TryParse 方法。我最近才发现 2008 年的实现,我对它的限制性不满意,特别是考虑到它是一种TRY PARSE方法;这意味着程序员正在测试输入!
一般来说,我更喜欢使用相信程序员知道他在做什么的方法:)
我的实现如下:
public static bool EnumTryParse<T>(string input, out T theEnum)
{
foreach (string en in Enum.GetNames(typeof(T)))
{
if (en.Equals(input, StringComparison.CurrentCultureIgnoreCase))
{
theEnum = (T)Enum.Parse(typeof(T), input, true);
return true;
}
}
theEnum = default(T);
return false;
}
Run Code Online (Sandbox Code Playgroud)
缺少 where T:struct 将信任放在开发人员的手中,但它允许您使用未知的通用枚举进行编译。
作为替代方法,如果您想在转换为指定的枚举时进行整数比较,您可以创建一个在 Enum.GetValues 上循环的方法。
希望这可以帮助。