Неуниверсальная версия (работает):
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;
}
Если ответ «нет», было бы полезно понять основное ограничение.