【发布时间】:2010-12-27 21:02:29
【问题描述】:
也许我是在证明我对 C# 或 .NET 框架的一些常用功能的无知,但我想知道是否有本地支持的方法来创建像 EmailAddress 这样的类型别名,其中别名为 @987654322 @ 但是这样我就可以用我自己的方法来扩展它,比如bool Validate()?
我知道 using x = Some.Type; 别名,但它们不是全局的,也不提供类型安全性,即可以将普通的 string 换成当前文件中的 using 别名。我希望我的 EmailAddress 是它自己的类型,独立且不能与它所覆盖的 string 类型互换。
我当前的解决方案是使用 T4 模板生成 public sealed partial EmailAddress : IEquatable<EmailAddress>, IXmlSerializable 类,生成样板隐式字符串转换运算符和其他类似的东西。现在这对我来说很好,并且给了我很大的灵活性,但在我的脑海里,我不得不生成如此大量的样板代码来做一些像创建强类型别名这样简单的事情,这似乎很愚蠢。
也许除了代码生成之外这是不可能的,但我很好奇其他人是否尝试过与他们的设计类似的东西以及你的经历。如果不出意外,也许这可以作为 C# 的假设未来版本中此类别名功能的一个很好的用例。谢谢!
编辑:我想要的真正价值是能够使用表示不同数据类型/格式的原始类型来获得类型安全。例如,EmailAddress 和 SocialSecurityNumber 和 PhoneNumber,它们都使用 string 作为它们的基础类型,但它们本身不是可互换的类型。我认为这会让您的代码更具可读性和自文档化,更不用说更多方法重载可能性的额外好处了。
【问题讨论】:
-
看来你至少有一个合理的 C# knoledgde 所以我的评论可能看起来很愚蠢,但你想要的是所谓的“类型层次结构”,而编写 String 类的人想阻止你使用它“OO 功能”,所以他们将 String 类密封,这就是为什么你不能做你想做的事。最好的方法是您现在正在使用的方法:创建自己的类型并隐式转换为 String。
标签: c# alias strong-typing