我試圖將輸入數據的驗證移入get; set;的類結構。get; set;與DateTime與.TryParse驗證?
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);
}
的結構也是在一個單獨的類(可能是不必要的)聲明:
public partial class DTVitem
{
public struct item
{
public DateTime dt;
public DateTime t;
public int v;
}
}
我每次設置DTVitem.item.dt
,DTVitem.item.t
,或DTVitem.item.v
,我希望它來執行相關.TryParse()
要驗證的屬性內容。
然而,當我嘗試使用的TryParse()如下(試圖環繞this example from MSDN我的頭):
public partial class DTVitem
{
private DateTime _datevalue;
public string dt
{
get { return _datevalue; }
set { DateTime.TryParse(value, out _datevalue) ;}
}
}
我收到錯誤_datevalue is a DateTime and cannot be converted to a string
。原因很明顯,在這種情況下返回路徑必須返回dt
的類型(一個string
)。但是,我試圖用幾種不同的方式來按摩這些東西,並且無法破解它。
將其設置爲結構實例的屬性時,如何實現驗證string
值爲DateTime
的目標?
正在使用set
,因爲我正試圖以最好的方式?
我可以看到使用get; set;有很多的價值;進行驗證,並且真的很想了解它。
非常感謝,
馬特
[編輯]
感謝以下Jon Skeet您指出我的方式犯錯。
Here's another thread on problems with mutable structs,and another speaking about instantiating a struct。注意structs are value types。
我相信他指出的其餘部分只是認爲將結構化的方式埋在很遠的地方是沒有必要的,我應該回顧一下爲什麼要這樣做。
[解決方案]
我已經考慮了以下一些建議,並提出了以下幾點:
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); }
}
}
裏面我的程序類,我實例化,並具有以下設置:
DTVitem item = new DTVitem();
item.dt = "2012/01/01";
item.t = "04:04:04";
item.v = "455";
所以我選擇不使用結構,而是一個類;或者真的是這個類的一個實例。
這很不清楚爲什麼你在'DTVitem'中有一個公共字段作爲嵌套類型的公共可變結構。所有這些對我來說都是一個糟糕的主意。 – 2013-02-19 21:27:42
你的錯誤是因爲你在'get'中返回一個'DateTime'來聲明一個被聲明爲'string'的屬性。 – juharr 2013-02-19 21:29:36
Get和Set應該只能獲取並設置一個變量。這聽起來像一個類對你來說比一個結構更有用,至少是你使用它的方式。片段調用集應負責使用有效的DateTime而不是struct/class。 – 2013-02-19 21:30:53