get;set; mit DateTime zu überprüfen .TryParse?
Ich bin versucht zu bewegen Validierung der input-Daten in den get;set; einer Klasse struct.
public void PlotFiles()
{
List<DTVitem.item> dataitems;
DTVitem.item i;
DateTime.TryParse("2012/01/01", out i.dt);
DateTime.TryParse("04:04:04", out i.t);
int.TryParse("455", out i.v);
dataitems.Add(i);
}
Struct deklariert ist, in eine separate Klasse (wahrscheinlich unnötig):
public partial class DTVitem
{
public struct item
{
public DateTime dt;
public DateTime t;
public int v;
}
}
Jedes mal, wenn ich DTVitem.item.dt
, DTVitem.item.t
oder DTVitem.item.v
ich wünschte, es zur Erfüllung der jeweiligen .TryParse()
zur Validierung des Eigentums Inhalt.
Jedoch, wenn ich versuche zu verwenden, TryParse() wie folgt (versuchen zu wickeln meinem Kopf herum das Beispiel aus der MSDN):
public partial class DTVitem
{
private DateTime _datevalue;
public string dt
{
get { return _datevalue; }
set { DateTime.TryParse(value, out _datevalue) ;}
}
}
Erhalte ich die Fehlermeldung, dass _datevalue is a DateTime and cannot be converted to a string
. Der Grund ist offensichtlich, dass der Rückweg muss wieder der Typ der dt
in diesem Fall (a string
). Jedoch, ich haben versucht, die massage es ein paar verschiedene Möglichkeiten, und ich bin nicht in der Lage, es zu hacken.
Wie kann ich mein Ziel erreichen der Validierung eines string
Wert als DateTime
bei der Einstellung als eine Eigenschaft einer Instanz der Struktur struct?
Ist mit set
wie ich bin versucht, die am besten Weg?
Kann ich sehen, dass es eine Menge von Wert in die Verwendung von get;set; für die Validierung und möchte wirklich, es zu verstehen.
Vielen Dank,
Matt
[Bearbeiten]
Dank Jon Skeet unten für den Hinweis auf den err meiner Wege.
Hier ist noch ein thread über Probleme mit mutable structs, und andere sprechen über die Instanziierung einer Struktur. Hinweis structs sind value-Typen.
Ich glaube, der rest von dem, was er war und wies ist irgendwie vereinbaren, dass das vergraben der struct Weg, weit Weg, ist es nicht nötig, und ich sollte überprüfen, warum mache ich es.
[Lösung]
Habe ich berücksichtigt einige Empfehlungen unten und kommen mit dem folgenden:
public partial class DTVitem
{
private DateTime _dtvalue, _tvalue;
private int _vvalue;
public string dt
{
get { return _dtvalue.ToString(); }
set { DateTime.TryParse(value, out _dtvalue); }
}
public string t
{
get { return _tvalue.ToString(); }
set { DateTime.TryParse(value, out _tvalue); }
}
public string v
{
get { return _vvalue.ToString(); }
set { int.TryParse(value, out _vvalue); }
}
}
In meinem Programm Klasse, ich habe instanziiert und mit den folgenden:
DTVitem item = new DTVitem();
item.dt = "2012/01/01";
item.t = "04:04:04";
item.v = "455";
Also habe ich entschieden, nicht zu verwenden, um eine Struktur, sondern eine Klasse, oder wirklich eine Instanz der Klasse.
DTVitem
. Alle diese wirken wie eine schlechte Idee zu mir.Ihr Fehler ist, da Sie zurückgeben, eine
DateTime
im get
für eine Eigenschaft, die erklärt, wie ein string
.Get-und Set sollte nur get-und set-Variablen. Es klingt wie ein Klasse würde mehr Sinn machen, Sie als eine Struktur, zumindest so, wie Sie es verwenden. Das Stück aufrufen soll verantwortlich sein für die Verwendung ein Gültiger DateTime-nicht der struct/class.
Überhaupt nicht wahr. Können Sie Kapseln Funktionalität in eine Immobilie, einschließlich der Validierung. Es gibt keinen Grund, zu kopieren Sie die Validierung code, um oder setzen Sie Anrufe, um es überall Sie setzen die Eigenschaft
Danke John für den Hinweis auf den schrecklichen Fehler. Ich bin kein dev durch Handel, also bin ich "voll-Dampf-ahead" - ing. Ich werde in diesem Blick, wie es ganz klar ein grundlegender Fehler. Sie könnten mehr konstruktiv beraten und über weitere Einzelheiten, es sei denn, der Ausschnitt ist so riesig, dass ich wieder auf meinen letzten Satz. Danke Ryan, ich werde in diese Richtung.
InformationsquelleAutor mbrownnyc | 2013-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Immobilie kann nur einen geben. Wenn Sie möchten, dass die Eigenschaft vom Typ "string", dann implementieren Sie es auf diese Weise:
Jedoch mit TryParse() bedeutet, dass die Set-wird nicht werfen eine Ausnahme, wenn das DateTime ist ungültig. Wenn Sie es wünschen, dies zu tun, verwenden Sie die DateTime.Parse() statt.
InformationsquelleAutor Oren Melzer
InformationsquelleAutor Sten Petrov
Du bist nur fehlt eine Typ-Konvertierung in der erhalten. _datevalue ist ein DateTime-aber Ihre Eigenschaft ist ein string.
InformationsquelleAutor 0xFF
Get;set; muss haben den gleichen Typ. Man gibt einen datetime -, wenn es erwartet einen string, daher die Fehlermeldung.
nur eine explizite Methode bool setDate(String datestring) und setzen Sie dort Ihren code. Können Sie die Rückgabe ein boolescher Wert, der von der tryparse Sie wissen lassen, wenn es erfolgreich war.
InformationsquelleAutor Thomas Kelly
Anderen (design meist) Probleme beiseite, es geht um das problem der Rückkehr
_datevalue
als string, können Sie einfach etwas wie:>>> Sie können auch prüfen wollen die docs für
DateTime.ToString()
und sehen, welches format Sie möchten, um Ihren string beim Zugriff auf die Eigenschaft.InformationsquelleAutor Mau