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.

È stato utile?

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);           
      } 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top