Question

Mis à part l'utilité discutable de ceci, je voudrais demander s'il est possible de faire quelque chose dans ce sens.

class MyPrimitive {
        String value;
        public String Value {
            get { return value; }
            set { this.value = value; }
        }
}

// Instead of doing this...
MyPrimitive a = new MyPrimitive();
a.Value = "test";
String b = a.Value;

// Isn't there a way to do something like this?
MyPrimitive a = "test";
String b = a;

J'aime insérer des types primitifs dans des classes personnalisées à l'aide d'une propriété afin que les méthodes get et set effectuent d'autres opérations, telles que la validation.
Comme je fais cela assez souvent, j'ai pensé qu'il serait bien d'avoir également une syntaxe plus simple, comme pour les primitives standard.
Néanmoins, je soupçonne que cela n’est pas seulement faisable, mais pourrait aussi être erroné sur le plan conceptuel. Toute idée serait la bienvenue, merci.

Était-ce utile?

La solution

Utilisez un type de valeur ( struct ) et attribuez-lui un Opérateur de conversion implicite du type souhaité dans le volet droit de l'affectation.

struct MyPrimitive
{
    private readonly string value;

    public MyPrimitive(string value)
    {
        this.value = value;
    }

    public string Value { get { return value; } }

    public static implicit operator MyPrimitive(string s)
    {
        return new MyPrimitive(s);
    } 

    public static implicit operator string(MyPrimitive p)
    {
        return p.Value;
    }
}

EDIT: La structure est immuable car Marc Gravell a absolument raison.

Autres conseils

Vous pouvez utiliser la diffusion implicite . Ce n'est pas recommandé, mais:

public static implicit operator string(MyString a) {
    return a.Value;
}
public static implicit operator MyString(string a) {
    return new MyString { value = a; }
}

Encore une fois, mauvaise pratique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top