Ric*_*ard 5 c# enums nullable constraints
我正在编写一些枚举功能,并具有以下功能:
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);
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
EnumHelper.ConvertStringToEnumValue<Enums.Animals?>("Cat");
Run Code Online (Sandbox Code Playgroud)
我现在想要将T的约束添加到Enum,例如(我从Stackoverflow文章中获得):where T : struct, IConvertible但是我遇到了问题,因为T需要能够获取可以为空的枚举.错误消息说:
类型'Enums.Animals?' 必须是非可空值类型才能在泛型类型或方法中将其用作参数"T"
有没有办法做到这一点,或者我需要依靠运行时检查我在方法内部?
谢谢大家!
不,没有约束说"T必须是值类型,包括可以为值的值类型".
但是,一种选择是将方法拆分为:
public static T ConvertStringToEnumValue<T>(...) where T : struct
public static T? ConvertStringToNullableEnumValue<T>(...) where T : struct
Run Code Online (Sandbox Code Playgroud)
除此之外,每个方法的实现也会更简单.
当然,我们不知道您将如何使用此代码 - 但如果您要直接从非泛型方法调用它,这将是我建议的方法.
当然,这仍然不会阻止某人用它T=int或类似的东西来调用它......你可能想要看看Unconstrained Melody更严格的约束.
| 归档时间: |
|
| 查看次数: |
955 次 |
| 最近记录: |