Comment permettre la conversion implicite?
Donné un peu de code comme ceci:
class Json
{
}
class Program
{
static void Main(string[] args)
{
}
Json MyAction()
{
return "{\"json\": 1}";
}
}
Est-ce que je peux ajouter à la Json
classe pour faire de cette compilation? Quelque chose qui permet au compilateur de savoir qu'il peut implicitement convertie en une chaîne Json?
- Je voudrais ajouter un
.ToJson()
méthode d'extension au lieu de surcharger leimplicit
opérateur puisque ce genre de conversion implicite viole certaines lignes directrices importantes(voir Saeed réponse). En particulier, il peut jeter, n'est pas sans perte et a étrange de la sémantique dans les comparaisons. - Je peux pas jeter 🙂 Mon plus gros souci ici c'est que l'action renvoie simplement un autre type, afin de les différencier à partir d'une chaîne, même si sinon il peut agir parfaitement comme une chaîne de caractères. De cette façon, je sais qui ContentType de jeu sans avoir à faire aucun travail supplémentaire (il suffit de régler le type de retour de la fonction de façon appropriée).
Vous devez vous connecter pour publier un commentaire.
La
implicite
opérateur de déclaration en c# permet de spécifier:Voici un exemple simple:
Quelques remarques:
D'abord, je n'aurais pas forcément aller dans cette voie, puisque la plupart des chaînes dans votre application ne sont pas sémantiquement équivalent à une chaîne JSON. Le but d'un opérateur de conversion est-à-dire deux types de toujours représenter sémantiquement équivalent de l'information (ou assez proche sémantiquement équivalent à être utilement traitées comme telles). Je recommande la mise en œuvre d'un
static Json Parse(string input)
ou peut-être même unstatic bool TryParse(string input, out Json json)
méthode sur votre classe Json au lieu. Le callsite, en général, devrait savoir qu'il attend de sa propre chaîne de contenir Json.En règle générale, si ma classe offre implicite type de conversion à partir d'un type, je trouve qu'il vaut mieux faire aucune analyse ou de ctor logique pour le même type de
private
. Ceci assure il n'y a qu'un moyen pour les consommateurs de faire une chose de particulier, pas de deux façons (ctor et de conversion) - d'où le privé ctor dans l'exemple ci-dessus. Il peut y avoir des exceptions à cela, mais c'est une bonne règle générale pour moi.La conversion implicite permet aussi des choses intéressantes avec les opérateurs de comparaison. Par exemple, maintenant que vous pouvez convertir implicitement de la chaîne json, vous pouvez également le faire:
if(myJson == "blah")
et il fera la conversion, puis d'appeler la==
opérateur sur votre objet Json, qui, par défaut, fera une référence de comparaison d'égalité.implicit
de mots clés pour ce genre de chose.. cool 🙂Ajouter un implicite opérateur:
Vous pouvez avoir un implicite convertisseur, mais prenez soin de ne pas perdre de données:
voir MSDN