首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Nullable Enum添加约束

为Nullable Enum添加约束
EN

Stack Overflow用户
提问于 2010-09-28 08:42:23
回答 2查看 1.1K关注 0票数 5

我正在编写一些Enum功能,并具有以下功能:

代码语言:javascript
复制
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);
}

我这样叫它:

代码语言:javascript
复制
EnumHelper.ConvertStringToEnumValue<Enums.Animals?>("Cat");

现在我想在Enum中添加约束,比如(我从Stackoverflow文章获得的):where T : struct, IConvertible,但是我遇到了问题,因为T需要能够接受可空的枚举。错误消息说:

类型'Enums.Animals?‘必须为非空值类型,才能将其用作泛型类型或方法中的参数“T”。

有办法做到这一点吗?还是只需要依赖方法中的运行时检查?

谢谢大家!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-28 08:48:18

不,没有写着"T必须是值类型,包括可空值类型“的约束。

然而,一种选择是将方法分成以下几个部分:

代码语言:javascript
复制
public static T ConvertStringToEnumValue<T>(...) where T : struct
public static T? ConvertStringToNullableEnumValue<T>(...) where T : struct

除了其他任何东西之外,每个方法的实现也会更简单。

当然,我们不知道您将如何使用这段代码--但是如果您要直接从非泛型方法调用它,这将是我建议的方法。

当然,这还是不能阻止别人用T=int之类的方式打电话.您可能需要查看无约束旋律,以获得更严格的约束。

票数 9
EN

Stack Overflow用户

发布于 2010-09-28 10:02:13

有一个技巧涉及C++/CLI,它确实允许Enum上的泛型约束。使用Enum约束在C++/CLI中编写一个基本抽象类。引用C#项目中的库并实现基类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3811042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档