【发布时间】:2013-02-04 17:43:56
【问题描述】:
我正在尝试将输入数据的验证移至 get;set;一个类结构。
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 值设置为结构实例的属性时,如何实现将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中有一个带有公共字段的公共可变结构作为嵌套类型。所有这些对我来说都是个坏主意。 -
您的错误是因为您在
get中为声明为string的属性返回了DateTime。 -
获取和设置应该只获取和设置一个变量。听起来类对你来说比结构更有用,至少在你使用它的方式上是这样。片段调用集应该负责使用有效的 DateTime 而不是结构/类。
-
@RyanGates 一点也不真实。您可以将功能封装在属性中,包括验证。没有理由在您设置属性的任何地方复制验证代码或调用它
-
感谢约翰指出了这个可怕的缺陷。我不是贸易开发人员,所以我正在“全力以赴”。我会调查一下,因为这显然是一个根本性缺陷。你可能会更有建设性并就更多细节提出建议,除非细节是如此之大以至于我可以参考我的最后一句话。谢谢瑞恩,我会朝那个方向看。
标签: c# properties get set