C# 私有隐式转换运算符的替代方法
我正在尝试编写一个简单的字符串枚举。显然,我通常使用标准枚举,但字符串中需要空格 我试图通过将构造函数设置为私有来阻止任何其他实例的构造。然而,我还希望进行隐式转换,使静态声明更容易/更整洁C# 私有隐式转换运算符的替代方法,c#,private,implicit-conversion,C#,Private,Implicit Conversion,我正在尝试编写一个简单的字符串枚举。显然,我通常使用标准枚举,但字符串中需要空格 我试图通过将构造函数设置为私有来阻止任何其他实例的构造。然而,我还希望进行隐式转换,使静态声明更容易/更整洁 public class StringEnum { public static StringEnum Foo = "A Foo"; public static StringEnum Bar = "A Bar"; public static StringEnum W
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进行编译。该运算符对此项无效。我可以将其公开,但其他代码可以构造非枚举成员。我也可以去掉静态实例并重新创建,但它看起来更整洁,如上所述
我只是想知道为什么你不能真正拥有私人转换运营商,以及是否有人可以建议一种满足我学究癖好的替代方式?来自:
至于语言设计者为什么选择要求转换运算符
为了公开……我想他们可能想避免吃得太多
那些操作符的“魔力”在于,他们不需要代码
在一个组件内以一种方式运行,而以一种完全不同的方式运行
在另一个总成内,没有任何明显迹象表明发生了什么
继续
另一种方法是:只需使用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
}
发件人:
至于语言设计者为什么选择要求转换运算符
为了公开……我想他们可能想避免吃得太多
那些操作符的“魔力”在于,他们不需要代码
在一个组件内以一种方式运行,而以一种完全不同的方式运行
在另一个总成内,没有任何明显迹象表明发生了什么
继续
另一种方法是:只需使用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
}
只是想知道为什么不能使用私有转换运算符
运算符只是围绕特殊方法的语法糖。在隐式转换的情况下,运算符被编译为如下内容:
public static string op_Implicit(StringEnum s)
{
// implementation
}
私有方法意味着隐藏实现细节——操作符意味着使类外的代码看起来更干净。私下里,仅仅创建一个方法来进行转换而不是隐式操作符是非常简单的。因此,拥有一个私有操作符没有什么价值,因为它只影响私有接口——它根本不影响公共接口。因此,这种特性的好处并不能证明设计、实现、测试、测试以及更多测试、文档和维护的成本是合理的
是否有人能提出另一种方式来满足我的迂腐
只需将转换设置为私有方法,而不是运算符
只是想知道为什么不能使用私有转换运算符
运算符只是围绕特殊方法的语法糖。在隐式转换的情况下,运算符被编译为如下内容:
public static string op_Implicit(StringEnum s)
{
// implementation
}
私有方法意味着隐藏实现细节——操作符意味着使类外的代码看起来更干净。私下里,仅仅创建一个方法来进行转换而不是隐式操作符是非常简单的。因此,拥有一个私有操作符没有什么价值,因为它只影响私有接口——它根本不影响公共接口。因此,这种特性的好处并不能证明设计、实现、测试、测试以及更多测试、文档和维护的成本是合理的
是否有人能提出另一种方式来满足我的迂腐
只需将转换设置为私有方法而不是运算符。为什么名称中需要空格?您是否可以向普通枚举中的每个项添加“显示名称”属性?或者查找以转换为字符串表示形式?您是否在寻找其他原因,而不是因为规范规定所有运算符都必须声明为公共和静态?通常情况下,这些都不会出现。为什么名称中需要空格?您是否可以向普通枚举中的每个项添加“显示名称”属性?或者查找以转换为字符串表示形式?您是否在寻找其他原因,而不是因为规范规定所有运算符都必须声明为公共和静态?通常情况下,这些都不会出现。非常感谢您的回答。不幸的是,我已经忽略了属性,因为它们使用反射,IMO甚至比简单的新StringEnum更混乱。我错过了另一个问题,谢谢你的链接。非常感谢你的回答。不幸的是,我已经忽略了属性,因为它们使用反射,IMO甚至比简单的新StringEnum更混乱。我错过了另一个问题,谢谢你的链接。