La declaración implicit
operador en C# le permite especificar:
{type to convert to} ({type to convert from} variablename)
Aquí está un ejemplo sencillo:
class Json
{
private Json(string json)
{
//logic to parse string into object
}
public static implicit operator Json(string input)
{
return new Json(input);
}
}
Algunas notas:
En primer lugar, I wouldn' necesariamente va esta ruta, ya que la mayoría de str ings en su aplicación no son semánticamente equivalentes a una cadena JSON. El propósito de un operador de conversión es decir que dos tipos siempre representan información semánticamente equivalente (o lo suficientemente cerca como semánticamente equivalente para ser útilmente tratados como tales). Recomiendo implementar un método static Json Parse(string input)
o tal vez incluso uno static bool TryParse(string input, out Json json)
en su clase Json. El callsite, en general, debería saber si espera que su propia cadena contenga Json.
Normalmente, si mi clase ofrece una conversión de tipo implícita de un tipo, me parece que es mejor realizar cualquier lógica de análisis o ctor para ese mismo tipo private
. Esto garantiza que solo hay una forma de que los consumidores puedan hacer algo en particular, no de dos maneras (ctor y conversión), de ahí el código privado en el ejemplo anterior. Puede haber excepciones a esto, pero ha sido una buena regla general para mí.
La conversión implícita también permite algunas cosas interesantes con los operadores de comparación. Por ejemplo, ahora que puede convertir implícitamente de cadena a json, también puede hacer: if(myJson == "blah")
y hará la conversión y luego llamará al operador ==
en su objeto Json, que de forma predeterminada hará una comparación de igualdad de referencia.
me gustaría añadir un .ToJson() '' método de extensión en lugar de sobrecargar el operador 'implicit' ya que este tipo de conversión implícita viola algunas pautas importantes (véase la respuesta de Saeed). En particular, puede arrojar, no es sin pérdida y tiene una semántica extraña en las comparaciones. – CodesInChaos
@CodeInChaos: puedo hacerlo no tirar :) Mi mayor preocupación aquí es que la acción simplemente devuelve un tipo diferente para diferenciarlo de una cadena, aunque de lo contrario puede actuar perfectamente como una cadena. De esta forma sé qué ContentType configurar sin que el usuario tenga que realizar ningún trabajo adicional (simplemente configure el tipo de devolución de la función de forma apropiada). – mpen