Я пишу некоторые функции Enum, и у меня есть следующее:
public static T ConvertStringToEnumValue<T>(string valueToConvert, bool isCaseSensitive)
{
if (typeof(T).BaseType.FullName != "System.Enum" && typeof(T).BaseType.FullName != "System.ValueType")
{
throw new ArgumentException("Type must be of Enum and not " + typeof (T).BaseType.FullName);
}
if (String.IsNullOrWhiteSpace(valueToConvert))
return (T)typeof(T).TypeInitializer.Invoke(null);
valueToConvert = valueToConvert.Replace(" ", "");
if (typeof(T).BaseType.FullName == "System.ValueType")
{
return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)), valueToConvert, !isCaseSensitive);
}
return (T)Enum.Parse(typeof(T), valueToConvert, !isCaseSensitive);
}
Я называю это так:
EnumHelper.ConvertStringToEnumValue<Enums.Animals?>("Cat");
Теперь я хочу добавить ограничения к T в Enum, например (что я получил из статьи Stackoverflow ): where T : struct, IConvertible
, но у меня возникли проблемы, поскольку T должен иметь возможность принимать обнуляемые перечисления , Сообщение об ошибке гласит:
Тип 'Enums.Animals?' должен быть необнуляемым типом значения, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе
Есть ли способ сделать это, или мне просто нужно полагаться на проверку во время выполнения, которую я имею внутри метода?
Спасибо всем!