【问题标题】:get;set; with DateTime to validate with .TryParse?得到;设置;使用 DateTime 验证 .TryParse?
【发布时间】: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.dtDTVitem.item.tDTVitem.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 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";

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

【问题讨论】:

  • 非常不清楚为什么在DTVitem 中有一个带有公共字段的公共可变结构作为嵌套类型。所有这些对我来说都是个坏主意。
  • 您的错误是因为您在 get 中为声明为 string 的属性返回了 DateTime
  • 获取和设置应​​该只获取和设置一个变量。听起来类对你来说比结构更有用,至少在你使用它的方式上是这样。片段调用集应该负责使用有效的 DateTime 而不是结构/类。
  • @RyanGates 一点也不真实。您可以将功能封装在属性中,包括验证。没有理由在您设置属性的任何地方复制验证代码或调用它
  • 感谢约翰指出了这个可怕的缺陷。我不是贸易开发人员,所以我正在“全力以赴”。我会调查一下,因为这显然是一个根本性缺陷。你可能会更有建设性并就更多细节提出建议,除非细节是如此之大以至于我可以参考我的最后一句话。谢谢瑞恩,我会朝那个方向看。

标签: c# properties get set


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我会检查一下这个可能性并回复回复。
【解决方案2】:
public partial class DTVitem
{
    private DateTime _datevalue;

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

【讨论】:

  • 谢谢,我会检查一下这个可能性并回复回复。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多