【问题标题】:Trying to parse String to Datetime in property (C#)尝试将字符串解析为属性中的日期时间(C#)
【发布时间】:2016-11-29 21:48:52
【问题描述】:

我试图将字符串解析为 DateTime 对象。那里没问题:-) 我的问题来了,当我尝试直接在属性设置方法中这样做时。

我认为我可以这样做:

        private DateTime _fromDate;
        public DateTime FromDate
        {
            get { return _fromDate; }
            set { _fromDate = DateTime.Parse(value); }
        }

但我收到此错误:

“参数 1:无法从 'System.DateTime' 转换为 'string'”

如果可以做到的话,有人知道怎么做吗?

【问题讨论】:

  • 你有“价值”的例子吗?
  • 值的类型是DateTime,而不是类型string

标签: c# datetime properties


【解决方案1】:

_fromDate 的类型为 DateTime

DateTime.Parse 接受 string 并返回 DateTime

您正在传入value 这已经是 DateTime 并且没有将DateTime 隐式转换为string

如果您想直接将string 解析为DateTime,那么您需要一个string 类型的新属性:

private DateTime _fromDate;
public string FromDate
{
    get { return _fromDate.ToString(); }
    set { _fromDate = DateTime.Parse(value); }
}

虽然您需要 a) 对字符串的格式进行一些控制,并且 b) 对输入字符串进行一些安全检查,以确保它不会在不是有效日期时引发异常。

【讨论】:

    【解决方案2】:

    该属性的类型为DateTime;您根本无法将字符串作为值传递,即使您打算自己将其转换为 DateTime

    用更专业的术语来说,这个属性导致你的类有一个方法

    public DateTime get_FromDate(DateTime value)
    {
        // your property setter code here
    }
    

    该方法采用DateTime 参数,无法更改。

    如果您想提供一种方便的方法将字符串转换为DateTime 给类的用户(可能是使用非平​​凡处理的用户),您可以将转换公开为您的类上的一种方法。用户每次都必须明确调用它,但这就是生活。

    【讨论】:

      【解决方案3】:

      您已经将参数作为DateTime 获取,因此无需解析它。

      如果你真的坚持要解析,就转成字符串

      set { _fromDate = DateTime.Parse(value.ToString()); }
      

      但如果你这样做,你会得到一个日期时间,将它转换为一个字符串,然后将它转换回一个日期时间,这……嗯,不是很好:)

      【讨论】:

        【解决方案4】:

        不是为了打败一个 4 年的死马,但我偶然发现了这个线程,其思考过程与 OP 相似,并想用这个主题总结我的个人发现。最终,如果要设置现有对象的 DateTime 属性,则必须提前解析它(如先前的答案所示)。但是,我实际上关心的是初始化对象,而您 CAN 传递了一个文本值以在构造函数中解析。

        public class SomeClass
        {
            public SomeClass(String date)
            {
                DateTime tmpDate;
                DateTime.TryParse(date, out tmpDate);
                if (tmpDate != DateTime.Minvalue)
                {
                    FromDate = tmpDate;
                }
                else
                {
                    throw new ArgumentError(("Unable to parse the input string " + date));
                }
        

        在我的特殊情况下,我希望我的 DateTime 属性可以为空,因此我必须创建一个方法 (pulled from here) 来处理解析(这将用于在外部和构造函数中解析数据。例如:

        public class SomeClass
        {
            public SomeClass(String date)
            {
                DateTime? tmpDate = this.TryParse(date);
                if (tmpDate.hasValue)
                {
                    FromDate = tmpDate;
                }
                else
                {
                    throw new ArgumentError(("Unable to parse the input string " + date));
                }
            }
            public DateTime? FromDate { get; set;}
        
            public DateTime? TryParse(string text)
            {
                DateTime date;
                if (DateTime.TryParse(text, out date))
                {
                    return date;
                }
                else
                {
                    return null;
                }
            }
        

        显然你会想要创建额外的构造函数,并且可能有一个匹配的类型构造函数作为你的默认值。

        【讨论】:

          【解决方案5】:

          简单使用

          private DateTime _fromDate;
          public DateTime FromDate
              {
                  get { return _fromDate; }
                  set { _fromDate = value; }
              }
          

          value 将属于DateTime,因为该属性属于DateTime。当有人为此属性分配DateTime object 时,它将进入value。在 Set 中,该值将分配给 _fromDate

          【讨论】:

          • 我试图将 DateTime 解析器的字符串构建到属性中。但最终使用 XmlConvert.ToDateTime 进行解析。
          【解决方案6】:

          您收到编译器错误,因为DateTime.Parse(string s) 采用string 输入参数,但value 的类型为DateTime,不能隐式转换为string

          你不需要解析这个值,因为它已经是DateTime,所以你可以把你的代码改成set { _fromDate = value; }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-14
            • 2012-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-28
            相关资源
            最近更新 更多