2009-06-09 31 views
15

Domanda semplice, si spera una risposta semplice:Accessor con diversi set e get types?

vorrei fare quanto segue:

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 
} 

Quanto sopra è solo un esempio di quello che sto cercando di fare. Mi piacerebbe avere un accesso pubblico a una variabile interna di tipo x. Voglio ottenere quella variabile come una stringa, ma impostarla usando qualcosa di tipo x.

È possibile?

--edit--

ho capito che potevo 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, permettetemi di dire che io uso tipo y invece di una "stringa" come il mio tipo 'get' . Se voglio usare "DateTimeProperty" altrimenti nel mio codice, dovrei farlo.

+1

Vi incoraggio vivamente di non utilizzare il codice nella tua modifica. A parte una strana pausa dalla convention, questo potrebbe avere una leggera performance e gravi problemi di localizzazione. –

+8

Non osare scrivere quel codice. – mquander

risposta

8

No. È possibile, 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, ancora meglio metodi usare al posto di proprietà (come indicato nel commento):

private DateTime m_internalDateTime; 
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; } 
public string GetDateTime() { return m_internalDateTime.ToString(); } 

tenere a mente che var è per implicitamente, in fase di compilazione digitato var iables, non variabili dinamiche.

Sicuramente non fare ciò che si è preso nota nel vostro modifica. Ha introdotto un'interruzione nella convenzione, possibili implicazioni sulla performance (anche se lieve) e problemi di localizzazione significativi.

+9

Se utilizzerete GetDateTime e SetDateTime, dovrebbero essere davvero metodi anziché proprietà. –

+0

Posso chiedere perché si dovrebbero fare questi metodi piuttosto che le proprietà? – Nick

+8

@Nick: perché i metodi sono come i verbi che fanno qualcosa a un oggetto e le proprietà sono come nomi che dicono qualcosa sull'oggetto. SetDateTime e GetDateTime sono i verbi, quindi dovrebbero essere metodi. –

5

Come proprietà, no questo non è possibile. È possibile creare metodi Get e Set di tipi diversi, ma per una proprietà i tipi devono essere uguali.

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 ti permette di accettare DateTime come input e restituire una stringa, questo non sarebbe un buon piano. Funziona, ma rende voi e chiunque l'accesso a questo codice, eseguire la convalida non necessaria. Inoltre, è vulnerabile a un altro sviluppatore in futuro, non sapendo, o realizzando le regole implicite, per le quali si è persa la sicurezza del tempo di compilazione. Inoltre, quasi nessun altro codice per creare due proprietà, o due metodi che realizzano lo stesso obiettivo, in maniera fortemente tipizzata.

Personalmente, raccomanderei l'utilizzo di due metodi (si veda il commento di Jeff Yates 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; 
} 
3

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(); } 
} 
0

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 digita e quando richiedi il valore restituisci un altro tipo.

0

come circa:

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);   
     } 
} 
3

Forse questo 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; 
}