Quizás estoy demostrando mi ignorancia de alguna característica muy utilizada de C# o .NET framework, pero me gustaría saber si existe una forma compatible nativamente para crear un alias de tipo como EmailAddress
que alias string
pero tal que ¿Puedo extenderlo con mis propios métodos como bool Validate()
?¿Hay alguna manera de definir los alias fuertemente tipados de C# de los tipos primitivos existentes como `string` o` int`?
Conozco los alias de using x = Some.Type;
pero estos no son globales ni proporcionan seguridad de tipo, es decir, se puede cambiar un string
ordinario por el alias en el archivo actual. Me gustaría que mi EmailAddress
sea de su propio tipo, independiente y no intercambiable con el tipo string
que sombrea.
Mi solución actual es generar clases public sealed partial EmailAddress : IEquatable<EmailAddress>, IXmlSerializable
con una plantilla T4 generando los operadores de conversión de cadenas implícitas y otras cosas similares. Esto está bien para mí por ahora y me da mucha flexibilidad, pero en el fondo de mi mente parece tonto que tenga que generar cantidades tan grandes de código repetitivo para hacer algo tan simple como crear un alias de tipo fuerte.
Quizás esto no sea posible más que con la generación de código, pero tengo curiosidad por saber si otros han intentado algo similar con sus diseños y cuáles han sido sus experiencias. Si nada más, quizás esto podría servir como un buen caso de uso para dicha función de alias en una hipotética versión futura de C#. ¡Gracias!
EDITAR: El valor real que deseo de esto es poder obtener seguridad de tipo con tipos primitivos que representan diferentes tipos/formatos de datos. Por ejemplo, un EmailAddress
y un SocialSecurityNumber
y un PhoneNumber
, todos los cuales usan string
como su tipo subyacente pero que no son tipos intercambiables en sí mismos. Creo que esto te da un código mucho más legible y autodocumentado, por no mencionar los beneficios adicionales de más posibilidades de sobrecarga de métodos que son menos ambiguas.
¿Por qué votar esto y no dejar un comentario? Vamos gente. – JMD
Parece que tienes al menos un C# knoledgde razonable así que mi comentario puede parecer estúpido, pero lo que quieres se llama "jerarquía de tipos" y los tipos que codificaron la clase String querían evitar que uses esta "característica OO", así que hicieron Clase de cadena sellada, es por eso que no podrás hacer lo que quieras. El mejor enfoque es este en el que estás ahora: crea tu propio tipo y una conversión implícita a String. –
@Andre: ¿por qué no considerar publicar tu comentario como respuesta? –