1

我正在尝试将输入数据的验证移至 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() 时(试图从 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此实例中的类型 (a string)。但是,我尝试了几种不同的方式来按摩它,但无法破解它。

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

正在使用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); }
    }
}

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

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

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

4

5 回答 5

3

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

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()。

于 2013-02-19T21:30:23.200 回答
1
public partial class DTVitem
{
    private DateTime _datevalue;

    public string dt
    {
        get { return _datevalue.ToString(); }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}
于 2013-02-19T21:30:34.433 回答
1

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

get { return _datevalue.ToString(); } //or .toShortDateString() or ToShorttimeString()
于 2013-02-19T21:32:18.983 回答
0

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

只需使用显式方法 bool setDate(String datestring) 并将您的代码放在那里。你可以从 tryparse 返回一个布尔值,让你知道它是否成功。

于 2013-02-19T21:32:04.037 回答
0

除了其他(主要是设计)问题,只是解决以字符串形式返回的问题_datevalue,您可以简单地执行以下操作:

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

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

于 2013-02-19T21:34:17.007 回答