收到设置使用DateTime进行验证.TryParse

本文关键字:验证 TryParse DateTime 设置 | 更新日期: 2023-09-27 18:00:15

我正试图将输入数据的验证转移到get;设置类结构的。

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.tDTVitem.item.v时,我都希望它执行相关的.TryParse()来验证属性内容。

然而,当我尝试按如下方式使用TryParse()时(试图从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有很大的价值;设置以进行验证,并且非常想了解它。

非常感谢

马特

[编辑]

感谢下面的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); }
    }
}

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

DTVitem item = new DTVitem();
item.dt = "2012/01/01";
item.t = "04:04:04";
item.v = "455";

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

收到设置使用DateTime进行验证.TryParse

一个属性只能有一种类型。如果您希望属性是字符串类型,那么您可以通过以下方式实现它:
public partial class DTVitem
{
    private DateTime _datevalue;
    public string dt
    {
        get { return _datevalue.ToString(); }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}

但是,使用TryParse()意味着如果DateTime无效,则setter不会抛出异常。如果您希望它执行此操作,请改用DateTime.Parse()。

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

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

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

获取;设置必须具有相同的类型。get返回一个日期时间,而它需要一个字符串,因此出现错误。

只需使用一个显式方法boolsetDate(Stringdatestring)并将代码放在那里。你可以从锥虫那里返回一个bool,让你知道它是否成功。

除了其他(主要是设计)问题之外,只需处理将_datevalue作为字符串返回的问题,您可以简单地执行以下操作:

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

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