Я добавил несколько методов расширения для строк, чтобы упростить работу с некоторыми пользовательскими перечислениями.
public static Enum ToEnum<T>(this string s)
{
return (Enum)Enum.Parse(typeof(T), s);
}
public static bool IsEnum<T>(this string s)
{
return Enum.IsDefined(typeof(T), s);
}
Примечание. Из-за ограничений общих типов я должен написать методы, подобные приведенным выше. Я хотел бы использовать T ToEnum (эту строку s), где T: Enum, чтобы избежать приведения после выполнения вызова ... но никто не может этого сделать.
В любом случае, я подумал, что было бы неплохо немного расширить эту концепцию, чтобы вернуть Enum? в тех случаях, когда сигнатура метода может принимать различные обнуляемые перечисления.
public static Enum? ToEnumSafe<T>(this string s)
{
return (IsEnum<T>(s) ? (Enum)Enum.Parse(typeof(T), s) : null);
}
Однако из-за ошибок компилятора это не разрешено.
error CS0453: The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable<T>'
Я должен признать, что я немного запутался здесь, как Enum? должно быть законное возвращаемое значение, нет? Я пробовал что-то подобное, но в конечном итоге с той же ошибкой.
public static T? ToEnumSafe<T>(this string s)
{
return (IsEnum<T>(s) ? (T)Enum.Parse(typeof(T), s) : null);
}
Я даже решил переписать методы удаления шаблонов и получаю больше того же:
public static bool IsEnum(this string s, Type T)
{
return Enum.IsDefined(T, s);
}
public static Enum? ToEnumSafe(this string s, Type T)
{
return (IsEnum(s, T) ? (Enum)Enum.Parse(T, s) : null);
}
Я что-то упускаю здесь действительно глупо?