我正在编写一些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");现在我想在Enum中添加约束,比如(我从Stackoverflow文章获得的):where T : struct, IConvertible,但是我遇到了问题,因为T需要能够接受可空的枚举。错误消息说:
类型'Enums.Animals?‘必须为非空值类型,才能将其用作泛型类型或方法中的参数“T”。
有办法做到这一点吗?还是只需要依赖方法中的运行时检查?
谢谢大家!
发布于 2010-09-28 08:48:18
不,没有写着"T必须是值类型,包括可空值类型“的约束。
然而,一种选择是将方法分成以下几个部分:
public static T ConvertStringToEnumValue<T>(...) where T : struct
public static T? ConvertStringToNullableEnumValue<T>(...) where T : struct除了其他任何东西之外,每个方法的实现也会更简单。
当然,我们不知道您将如何使用这段代码--但是如果您要直接从非泛型方法调用它,这将是我建议的方法。
当然,这还是不能阻止别人用T=int之类的方式打电话.您可能需要查看无约束旋律,以获得更严格的约束。
发布于 2010-09-28 10:02:13
有一个技巧涉及C++/CLI,它确实允许Enum上的泛型约束。使用Enum约束在C++/CLI中编写一个基本抽象类。引用C#项目中的库并实现基类。
https://stackoverflow.com/questions/3811042
复制相似问题