Funzione di accesso con diversi set e get tipi?
Domanda
Domanda semplice, si spera, una semplice risposta:
Vorrei fare le seguenti cose:
private DateTime m_internalDateTime;
public var DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = value; } // here value is of type DateTime
}
Sopra è solo un esempio di quello che sto cercando di fare.Mi piacerebbe avere una pubblica funzione di accesso a una variabile interna del tipo x.Voglio che la variabile è una stringa, ma utilizzando qualcosa del tipo x.
È possibile questo?
--edit--
Mi sono appena resa conto che avrei potuto fare qualcosa di simile:
private DateTime m_internalDateTime;
public object DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}
Ma poi, che dire, io uso tipo y invece di una "stringa", come il mio 'get' tipo.Se voglio usare "DateTimeProperty" altro dove nel mio codice, mi piacerebbe avere per il cast.
Soluzione
No. Si può ovviamente aggiungere il .ToString () nel codice chiamante, ma non si può fare ciò che si propone, senza nomi diversi come questo:
private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime { get { return m_internalDateTime.ToString(); } }
O, meglio ancora utilizzare metodi, invece di proprietà (come indicato nei commenti):
private DateTime m_internalDateTime;
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; }
public string GetDateTime() { return m_internalDateTime.ToString(); }
Tieni presente che var
è per il momento in fase di compilazione implicitamente , digitato var iables, non dinamica variabili.
Sicuramente non fare ciò che si è preso nota nel vostro modifica. Si introduce una pausa in convenzione, possibili implicazioni prestazioni (seppur lieve), ei problemi di localizzazione significativi.
Altri suggerimenti
Come proprietà, no questo non è possibile. Si potrebbe fare metodi get e set che sono di diversi tipi, ma per una proprietà dei tipi deve essere lo stesso.
EDIT:
Mentre:
private DateTime m_internalDateTime;
public object DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}
è sintatticamente corretto, verrà compilato e permette di accettare DateTime come input e restituire una stringa, questo non sarebbe un buon piano. Funziona, ma ti fa e chiunque l'accesso a questo codice, eseguire la convalida non necessari. Inoltre, è vulnerabile a un altro sviluppatore, in futuro, non sapendo, o realizzando le regole implicite, per cui si è perso di sicurezza fase di compilazione. Inoltre, la sua quasi nessun codice più per creare o due proprietà, o due metodi che raggiungere lo stesso obiettivo, in modo fortemente tipizzato.
Personalmente, mi consiglia di utilizzare due metodi (vedi Jeff Yates commento per una buona spiegazione del perché).
private DateTime m_internalDateTime;
public string GetDateTime()
{
return m_internalDateTime.ToString();
}
public void SetDateTime(DateTime dateTime)
{
m_internalDateTime = dateTime;
}
Non è in questo modo, ma si può certamente avere una seconda proprietà che accede al campo m_internalDateTime.
public string DateTimeString
{
get { return m_internalDateTime.ToString(); }
}
Forse che aiuta
public class TDecimal
{
private decimal? m_value;
public bool HasValue { get { return m_value.HasValue; } }
public decimal Value { get { return m_value.Value; } }
public static implicit operator TDecimal(string a_value)
{
decimal d;
if (decimal.TryParse(a_value, out d))
{
return new TDecimal() {m_value = d};
}
return new TDecimal() {m_value = null};
}
public static implicit operator decimal(TDecimal a_value)
{
if(a_value.HasValue)
{
return a_value.Value;
}
throw new ArgumentNullException("a_value");
}
}
public class A
{
public TDecimal Prop { get; set; }
}
A a = new A();
a.Prop = "123";
if (a.Prop.HasValue)
{
decimal d = a.Prop;
}
Risposta semplice no, al codice di fuori vostra proprietà si comporterà il modo esatto in cui un campo sarebbe, non si può avere una proprietà con diverso set / get tipi così come non si potrebbe avere un archiviato essere impostato con un tipo e quando si richiede il suo valore ottenere un diverso tipo di nuovo.
come su:
private DateTime intDT;
public string DateTimeProperty
{
get { return intDT.ToString(); } // Return a string
set
{
DateTime dt;
if (DateTime.TryParse(value, out dt))
intDT = dt;
else throw new ArgumentException(string.Format(
"{0} cannot be converted to a DateTime.", value);
}
}