Frage

Einfache Frage, hoffentlich eine einfache Antwort:

Ich möchte Folgendes tun:

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
}

Die oben ist nur ein Beispiel dafür, was ich zu tun werde versuchen. Ich möchte eine öffentlichen Zugriffs auf eine interne Variable vom Typ x haben. Ich möchte die diese Variable als String, aber setzen Sie ihn etwas vom Typ x verwendet wird.

Ist das möglich?

- bearbeiten -

Ich habe gerade erkannte ich etwas tun könnte, wie:

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
}

Aber dann, lassen Sie sagen, dass ich Typ y anstelle eines „string“, wie mein ‚get‘ Typ. Wenn ich verwenden „DateTimeProperty“ will sonst wo in meinem Code, ich muß es gegossen.

War es hilfreich?

Lösung

Nein. Sie können natürlich die .ToString () in der anrufenden Code hinzufügen, aber Sie können nicht tun, was Sie ohne unterschiedliche Namen wie diese schlagen vor:

private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime   { get { return m_internalDateTime.ToString(); } } 

Oder, noch bessere Methoden verwenden anstelle von Eigenschaften (wie in den Kommentaren angegeben):

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

Beachten Sie, dass var ist für implizit , Compiler-getippt var iables, nicht dynamische Variablen.

Auf jeden Fall nicht tun, was Sie in Ihrem bearbeiten zur Kenntnis genommen. Er führte eine Pause in Konvention, mögliche Auswirkungen auf die Leistung (wenn auch geringen) und erhebliche Lokalisierungsprobleme.

Andere Tipps

Als Eigenschaft, nicht das ist nicht möglich. Sie könnten sich machen und Methoden fest, die von verschiedenen Arten sind, aber für eine Eigenschaft die Typen müssen identisch sein.

EDIT:

Während:

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
}

syntaktisch korrekt ist, wird kompilieren und ermöglicht es Ihnen, Datetime als Eingabe zu akzeptieren und einen String zurückgeben, wäre dies kein guter Plan. Es funktioniert, aber es macht Sie und jemand diesen Code zugreifen, nicht mehr benötigte Validierung durchzuführen. Darüber hinaus ist es an einem anderen Entwickler in Zukunft verletzlich, nicht zu wissen, oder die impliziten Regeln zu realisieren, für die Sie Kompilierung Sicherheit verloren haben. Darüber hinaus sein kaum mehr Code entweder zwei Eigenschaften erzeugen oder zwei Methoden, die das gleiche Ziel zu erreichen, in eine stark typisierten Weise.

Persönlich würde ich empfehlen die Verwendung von zwei Methoden (siehe Jeff Yates Kommentar für eine gute Erklärung, warum).

private DateTime m_internalDateTime;
public string GetDateTime()
{
    return m_internalDateTime.ToString();
}

public void SetDateTime(DateTime dateTime)
{
    m_internalDateTime = dateTime;
}

Nicht auf diese Weise, aber man kann sicherlich eine zweite Eigenschaft haben, dass das m_internalDateTime Feld zugreift.

public string DateTimeString
{
   get { return m_internalDateTime.ToString(); }
}

Vielleicht hilft

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

Einfache Antwort nein, zu Ihrem außerhalb Code Ihrer Immobilie wird die genaue Art und Weise verhalten, dass ein Feld, würden Sie nicht mit einer Eigenschaft, anderen Satz haben / bekommen Typen wie Sie keine eingereicht wird gesetzt mit einer Art haben könnten und wenn Sie es Wert verlangen eine andere Art zurück.

, wie etwa:

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);           
      } 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top