获取;设置;使用 DateTime 来验证 .TryParse?

mbr*_*nyc 3 c# get properties set

我正在尝试将输入数据的验证移至 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);

    }
Run Code Online (Sandbox Code Playgroud)

该结构在单独的类中声明(可能没有必要):

public partial class DTVitem
{
    public struct item
    {
        public DateTime dt;
        public DateTime t;
        public int v;
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我设置DTVitem.item.dtDTVitem.item.t或 时DTVitem.item.v,我希望它执行相关操作.TryParse()来验证属性内容。

但是,当我尝试按如下方式使用 TryParse() 时(试图理解MSDN 中的这个示例):

public partial class DTVitem
{
    private DateTime _datevalue;

    public string dt
    {
        get { return _datevalue; }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误是_datevalue is a DateTime and cannot be converted to a string. dt原因显然是返回路径必须返回本实例中的类型(a string)。然而,我尝试了几种不同的方式来解决这个问题,但无法破解它。

string将值DateTime设置为结构实例的属性时,如何实现将值验证为 a 的目标?

我正在尝试使用是set最好的方法吗?

我可以看到使用 get;set; 有很多价值。进行验证并且真的很想了解它。

非常感谢,

马特

[编辑]

感谢下面的Jon Skeet指出我的错误。

这是关于可变结构问题的另一个线程还有一个关于实例化结构的线程。注意结构是值类型

我相信他指出的其余内容有点同意将结构埋得很远是没有必要的,我应该回顾一下为什么要这样做。

[解决方案]

我考虑了以下一些建议并提出以下建议:

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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的程序类中,我已经实例化并设置了以下内容:

DTVitem item = new DTVitem();
item.dt = "2012/01/01";
item.t = "04:04:04";
item.v = "455";
Run Code Online (Sandbox Code Playgroud)

所以我选择不使用结构体,而是使用类;或者实际上是该类的一个实例。

Ore*_*zer 5

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

public partial class DTVitem
{
    private DateTime _datevalue;

    public string dt
    {
        get { return _datevalue.ToString(); }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,使用 TryParse() 意味着如果 DateTime 无效,setter 不会抛出异常。如果您希望它这样做,请改用 DateTime.Parse() 。