Domanda

A parte la discutibile utilità di questo, vorrei chiedere se è possibile fare qualcosa in tal senso.

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;

Mi piace avvolgere i tipi primitivi in ??classi personalizzate usando una proprietà per fare in modo che il metodo get e set eseguano altre cose, come la validazione.
Dato che lo sto facendo abbastanza spesso ho pensato che sarebbe stato bello avere anche una sintassi più semplice, come per le primitive standard.
Tuttavia, sospetto che questo non solo non sia fattibile, ma potrebbe anche essere concettualmente sbagliato. Eventuali approfondimenti sarebbero i benvenuti, grazie.

È stato utile?

Soluzione

Usa un tipo di valore ( struct ) e assegnagli un operatore di conversione implicita del tipo desiderato nella parte destra dell'assegnazione.

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: ha reso la struttura immutabile perché Marc Gravell ha assolutamente ragione.

Altri suggerimenti

Puoi usare casting implicito . Non è raccomandato, ma:

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

Ancora una volta, cattiva pratica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top