2013-02-19 35 views
1

我试图将输入数据的验证移入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.dtDTVitem.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 structsand 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"; 

所以我选择不使用结构,而是一个类;或者真的是这个类的一个实例。

+6

这很不清楚为什么你在'DTVitem'中有一个公共字段作为嵌套类型的公共可变结构。所有这些对我来说都是一个糟糕的主意。 – 2013-02-19 21:27:42

+2

你的错误是因为你在'get'中返回一个'DateTime'来声明一个被声明为'string'的属性。 – juharr 2013-02-19 21:29:36

+1

Get和Set应该只能获取并设置一个变量。这听起来像一个类对你来说比一个结构更有用,至少是你使用它的方式。片段调用集应负责使用有效的DateTime而不是struct/class。 – 2013-02-19 21:30:53

回答

3

属性只能有一种类型。如果您希望属性是字符串类型的,那么你就可以实现这样说:

public partial class DTVitem 
{ 
    private DateTime _datevalue; 

    public string dt 
    { 
     get { return _datevalue.ToString(); } 
     set { DateTime.TryParse(value, out _datevalue) ;} 
    } 
} 

但是,使用的TryParse()将意味着,如果日期时间是无效的setter不会抛出异常。如果你想要这样做,请改用DateTime.Parse()。

+0

谢谢我会检查出这个可能性并回复并回复。 – mbrownnyc 2013-02-19 21:35:03

1
public partial class DTVitem 
{ 
    private DateTime _datevalue; 

    public string dt 
    { 
     get { return _datevalue.ToString(); } 
     set { DateTime.TryParse(value, out _datevalue) ;} 
    } 
} 
+0

谢谢我会检查出这个可能性并回复并回复。 – mbrownnyc 2013-02-19 21:35:27

0

get; set;必须具有相同的类型。当你期待一个字符串时,你的get返回一个日期时间,因此错误。

只需使用显式方法bool setDate(String datestring)并将代码放在那里。你可以从tryparse中返回一个bool来告诉你它是否成功。

1

你只是缺少get中的类型转换。 _datevalue是DateTime,但是您的属性是一个字符串。

get { return _datevalue.ToString(); } //or .toShortDateString() or ToShorttimeString() 
+0

感谢您指出这一套功能。 – mbrownnyc 2013-02-20 17:09:08

0

其他(设计居多)问题放在一边,刚开回_datevalue作为字符串的问题,你可以简单地这样做:

public string dt 
{ 
    get { return _datevalue.ToString(); } 
    set { if(!DateTime.TryParse(value, out _datevalue)) /* Error recovery!! */ ;} 
} 

>>>您可能还需要检查DateTime.ToString()的文档并查看访问该属性时想要获取字符串的格式。