替代私有隐式转换操作符

本文关键字:转换 操作符 | 更新日期: 2023-09-27 18:02:34

我想写一个简单的字符串enum。显然,我通常会使用标准enum,但我需要在字符串中使用空格。

我试图通过将构造函数设为私有来防止构造任何其他实例。但是,我还需要一个隐式转换,以使静态声明更容易/更整洁(最后一行)

public class StringEnum
{
    public static StringEnum Foo      = "A Foo";
    public static StringEnum Bar      = "A Bar";
    public static StringEnum Wibble   = "A Wibble";
    public static StringEnum Crotchet = "A Crotchet";
    //etc...
    //implicit cast to string
    public static implicit operator string(StringEnum s) { return s.privateString; }
    //private construction
    private string privateString;      
    private StringEnum(string s) { this.privateString = s; }
    private static implicit operator StringEnum(string s) { return new StringEnum(s); }
}  

此隐式操作符编译失败,提示" private修饰符对此项目无效"。我可以把它设为公共,但其他代码可以构造非枚举成员。我也可以删除并新建静态实例,但它看起来比上面整洁得多。

只是想知道为什么你不能有私有转换操作符,是否有人可以建议一个替代的方法来满足我的迂腐?

替代私有隐式转换操作符

只是想知道为什么不能有私有转换操作符

操作符只是特殊方法的语法糖。在隐式转换的情况下,操作符被编译为如下格式:

public static string op_Implicit(StringEnum s)
{
    // implementation
}

private方法用来隐藏实现细节——操作符用来使类之外的代码看起来更干净。私下里,创建一个方法来完成转换比创建一个隐式操作符要简单得多。所以拥有私有操作符的价值很小,因为它只影响私有接口——它根本不影响公共接口。因此,这样一个特性的好处并不能证明其成本(设计、实现、测试、测试,以及更多的测试、文档和维护)

是否有人能建议一个替代的方法来满足我的迂腐?

从这个答案

关于为什么语言设计者选择要求转换操作符我想他们可能是想避免拥有太多这些运算符身上有"魔力"——也就是说,他们不想要代码以一种方式在一个装配体中发挥作用,又以完全不同的方式发挥作用在另一个集会里,没有任何明显的迹象表明是什么。

至于另一种方法:你可以用Description属性标记enum成员,并使用反射来获得"友好"的成员名:

public enum MyEnum
{
     [Description("My Foo Member")]
     FooMember,
     Bar_Member
}
...
public static string GetFriendlyName(Enum enumValue)
{
    var descriptionAttribute = ReflectionUtil.GetAttribute<DescriptionAttribute>(enumValue);
    return descriptionAttribute != null
        ? descriptionAttribute.Description
        : enumValue.ToString(); // or .Replace("_", " ") for example
}