我可以使这个解析枚举名称列表的函数通用吗
本文关键字:列表 函数 可以使 枚举 我可以 | 更新日期: 2023-09-27 18:19:57
非通用版本(作品):
eTargets ParseTargets(string input)
{
eTargets targets = eTargets.None;
string[] items = input.Split(',');
foreach (var item in items)
{
eTargets target;
if (Enum.TryParse(item, out target))
{
targets |= target;
}
else
{
Logger.LogError("invalid target: " + item);
}
}
return targets;
}
尝试通用版本(不编译):
T ParseNames<T>(string delimitedNames) where T : struct
{
T result = default(T);
foreach (var name in delimitedNames.Split(','))
{
T parsed;
if (Enum.TryParse<T>(name, out parsed))
result |= (int)parsed; // ERROR: cannot convert T to int
// result |= parsed --> operator |= cannot be applied to T and int
}
return (T)result;
}
如果答案是"否",那么了解潜在的局限性会很有帮助。
怎么样
T ParseNames<T>(string delimitedNames) where T : struct //, Enum
{
return (T) Enum.Parse(typeof(T), delimitedNames);
}
您的代码已经包含1、2、4、8编号,因此这里唯一的"间隙"是对[Flags]
属性的要求
这应该有效:
static T ParseNames<T>(string delimitedNames) where T : struct
{
int result = 0;
foreach (var name in delimitedNames.Split(','))
{
result |= (int)Enum.Parse(typeof(T), name);
}
return (T)(object)result;
}