我有一个关于从字符串解析枚举的奇怪问题。实际上,我的应用程序需要处理从配置文件中解析几个枚举。但是,我不想为每个枚举类型编写解析例程(因为有很多)。
我面临的问题是以下代码显示了一些奇怪的错误 - T的类型必须是不可为空的值类型或类似的东西。我认为枚举默认是不可空的?
如果我使用T
限制where T : enum
的类型,则方法正文中的所有其他内容(if Enum.TryParse
语句除外)都会加下划线错误。
任何人都可以帮助解决这个奇怪的小问题吗?
谢谢, 马丁
public static T GetConfigEnumValue<T>(NameValueCollection config,
string configKey,
T defaultValue) // where T : enum ?
{
if (config == null)
{
return defaultValue;
}
if (config[configKey] == null)
{
return defaultValue;
}
T result = defaultValue;
string configValue = config[configKey].Trim();
if (string.IsNullOrEmpty(configValue))
{
return defaultValue;
}
//Gives me an Error - T has to be a non nullable value type?
if( ! Enum.TryParse<T>(configValue, out result) )
{
result = defaultValue;
}
//Gives me the same error:
//if( ! Enum.TryParse<typeof(T)>(configValue, out result) ) ...
return result;
}
用户请求发布错误的文本(它是在代码时,而不是编译/运行时),所以在这里:
类型'T'必须是非可空值类型才能在泛型类型或方法'System.Enum.TryParse(string,out TEnum)'中使用它作为参数TEnum
答案 0 :(得分:1)
好的,考虑到这些信息,我看到了Enum.TryParse
方法抱怨的内容。
对方法设置通用约束,如下所示:
public static T GetConfigEnumValue<T>(NameValueCollection config,
string configKey,
T defaultValue) // where T : ValueType
或者只是放置Enum.TryParse
方法上的相同约束。
where T : struct, new()
你可以在这里找到这个定义:
答案 1 :(得分:1)
public static T GetConfigEnumValue<T>(NameValueCollection config, string configKey, T defaultValue)
{
if (config == null)
{
return defaultValue;
}
if (config[configKey] == null)
{
return defaultValue;
}
T result = defaultValue;
string configValue = config[configKey].Trim();
if (string.IsNullOrEmpty(configValue))
{
return defaultValue;
}
try
{
result = (T)Enum.Parse(typeof(T), configValue, true);
}
catch
{
result = defaultValue;
}
return result;
}
答案 2 :(得分:0)
由于C#不允许您where T : enum
,因此您必须使用where T : struct
。
请注意,有Michael建议限制此限制。
答案 3 :(得分:0)