Come faccio a garantire il valore della proprietà per gli altri che dipendono da essa?
-
28-09-2019 - |
Domanda
Ho un immobile in questo modo:
private Decimal _payout;
public Decimal PayoutValue
{
get { return _payout; }
set
{
_payout = value;
//second part of following conditional is an enum
if (Math.Abs(value) > 1 && this.PayoutType == CutType.Percent)
{
_payout /= 100;
}
}
}
Come si può vedere, è dipende dal valore di PayoutType
, che è solo una proprietà enum semplice:
public CutType PayoutType { get; set; }
Il mio problema è che PayoutType
non sembra per avere istituito prima PayoutValue
è impostato, in modo che il condizionale qui sotto non è mai vero. Come faccio a forzare il PayoutType
da impostare prima di PayoutValue
viene valutato?
Grazie.
UPDATE Grazie per le vostre risposte ragazzi. Credo che dovrei già detto che la maggior parte del tempo questo oggetto è legato tramite DataContexts o da un Http.Post dal mio lato client (progetto MVC), quindi in realtà non hanno alcun costruttore. C'è un altro modo, o devo iniziare a ricevere creativo con la mia programmazione?
Soluzione
Che ne dici di questo?
get
{
if (Math.Abs(value) > 1 && this.PayoutType == CutType.Percent)
{
return _payout /100;
}
return _payout;
}
set{_payout = value;}
In modo che non si modifica il valore che è stato impostato.
Altri suggerimenti
Come faccio a forzare il PayoutType da impostare prima di PayoutValue viene valutato?
Mettilo nel costruttore. Questo è l'unico modo per far rispettare questa regola.
Detto questo, mi sento di raccomandare contro questo, almeno nell'implementazione sopra. L'implementazione attuale proprietà sarà molto, molto confusa per gli utenti. Le persone tendono ad aspettarsi che l'impostazione di una proprietà, poi subito il recupero fornirà lo stesso valore.
Nel tuo caso, però:
decimal value = 45.3;
myObject.PayoutValue = value; // Set this
if (myObject.PayoutValue != value)
{
// This would normally be a very unexpected case! In your example, it will always be true!
}
Sarebbe molto meglio utilizzare potenzialmente due proprietà, o un metodo. (Es: SetPayoutValue(decimal value)
) per indizio all'utente nel fatto che non comporta come una semplice proprietà
Tutte le proprietà "necessaria" dovrebbe essere nel costruttore della classe.