【问题标题】:C# explicit cast string to enumC# 将字符串显式转换为枚举
【发布时间】:2010-11-06 20:51:11
【问题描述】:

我想在 c# 中从字符串到枚举之间进行显式转换,以便实现:

(MyEnum) Enum.Parse(typeof(MyEnum),stringValue)

我想将其驱逐到显式转换运算符中,我这样做了但没有奏效:

public static explicit operator (MyEnum)(value stringValue){
     return (MyEnum) Enum.Parse(typeof(MyEnum),stringValue);
}

您知道在 C# 中是否可以使用 .NET 3.5?

【问题讨论】:

    标签: c# .net-3.5 enums casting


    【解决方案1】:

    无法进行演员表。问题是用户定义的转换必须包含在结构或类声明中,并且转换必须是到或来自封闭类型。因此,

    public static explicit operator MyEnum(string value)
    

    不可能,因为MyEnumstring 都不能是封闭类型。

    ECMA334 C# 规范的相关部分是 17.9.4:

    转换运算符从源类型转换,由转换的参数类型指示 运算符,转换为由转换运算符的返回类型指示的目标类型。一个类或结构是 仅当以下所有条件都为真时,才允许声明从源类型 S 到目标类型 T 的转换, 其中 S0 和 T0 是删除尾随所产生的类型?修饰符,如果有的话,来自 S 和 T:

    S0 和 T0 是不同的类型。

    S0 或 T0 是发生运算符声明的类或结构类型

    S0 和 T0 都不是接口类型。

    排除用户定义的转换,不存在从 S 到 T 或从 T 到 S 的转换。

    但是,你可以在字符串类上做一个扩展方法。

    public static class StringExtensions {
        public static T ConvertToEnum<T>(this string value)  {
            Contract.Requires(typeof(T).IsEnum);
            Contract.Requires(value != null);
            Contract.Requires(Enum.IsDefined(typeof(T), value));
            return (T)Enum.Parse(typeof(T), value);
        }
    }
    

    【讨论】:

    • 很好的答案!我知道我在某个地方看到过它,但不记得如何解决这个问题。谢谢!
    • 伟大的扩展!很多时候人们忘记确保值是在枚举中定义的。
    • @Gromer 我觉得值得一提的是 .Net 4.0 为此添加了一个方法Enum.TryParse()
    【解决方案2】:

    是否需要使用强制转换运算符?另一种选择是从字符串中添加一个扩展方法:

    public static class StringEnumConversion
    {
        public static T Convert<T>(this string str)
        {
            return (T)Enum.Parse(typeof(T), str);
        }
    }
    

    【讨论】:

      【解决方案3】:

      您也可以使用“StringValue”属性来获得您想要的。

      看看这个问题:stackoverflow.com/questions/424366/c-string-enums,那里有很多信息可能会有所帮助。

      干杯

      【讨论】:

        猜你喜欢
        • 2015-06-10
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多