Accesso al valore di lettura della proprietà all'interno dell'inizializzatore dell'oggetto C#

StackOverflow https://stackoverflow.com/questions/5854421

Domanda

Vorrei fare riferimento a una proprietà su un oggetto all'interno di un inizializzatore dell'oggetto. Il problema è che la variabile non esiste ancora, quindi non posso fare riferimento come normale (oggetto.method). Non so se esiste una parola chiave per fare riferimento all'oggetto nella creazione durante l'inizializzazione dell'oggetto.

Quando compilo il seguente codice ottengo l'errore: nel contesto non esiste "la larghezza del nome" non esiste nel contesto. Capisco perché Ricevo questo errore, ma la mia domanda è: c'è qualche sintassi per farlo?

public class Square
{
    public float Width { get; set; }
    public float Height { get; set; }
    public float Area { get { return Width * Height; } }
    public Vector2 Pos { get; set; }

    public Square() { }
    public Square(int width, int height) { Width = width; Height = height; }
}

Square mySquare = new Square(5,4)
{
    Pos = new Vector2(Width, Height) * Area
};

Vorrei fare riferimento alla "larghezza", "altezza" e "area" delle proprietà in termini di "mysquare".

È stato utile?

Soluzione

Non puoi farlo come scritto, ma puoi definire il Pos Proprietà per fare la stessa cosa. Invece di

public Vector2 Pos { get; set; }

Fai questo

public Vector2 Pos
{
    get 
    {
        return new Vector2(Width, Height) * Area;
    }
}

Naturalmente, allora qualsiasi quadrato ha la stessa definizione per Pos. Non sono sicuro che sia quello che vuoi.

Modificare

Sulla base del tuo commento, lo prendo, vuoi essere in grado di specificare il valore di POS in modo deferente per quadrati diversi. Ecco un'altra idea. È possibile aggiungere un terzo argomento al costruttore che prende un delegato, quindi il costruttore potrebbe utilizzare il delegato internamente per impostare la proprietà. Quindi quando crei un nuovo quadrato, si passa semplicemente in un lambda per l'espressione che desideri. Qualcosa come questo:

public Square(int width, int height, Func<Square, Vector2> pos) 
{ 
    Width = width; 
    Height = height; 
    Pos = pos(this);
}

poi

Square mySquare = new Square(4, 5, sq => new Vector2(sq.Width, sq.Height) * sq.Area);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top