public static DateTime ObjectToDateTime(object o, DateTime defaultValue)
{            
    if (o == null) return defaultValue;

    DateTime dt;
    if (DateTime.TryParse(o.ToString(), out dt))
        return dt;
    else
        return defaultValue;
}


代码感觉太冗长,而且味道不好。有更好的方法吗?

评论

您可以摆脱“其他”(因为在真实情况下它已经返回),但这并没有太大的改进。除此之外,对我来说,这似乎是最佳的选择。

返回o作为DateTime? defaultValue;

DateTime是一种值类型,因此不能与as运算符一起使用,也不能设置为null。那将是无效的代码。

正如@Jeff Mercado所说,您不能将DateTime对象与as关键字一起使用。转换失败不能设置为null。但是,如果使用DateTime? (可为空的DateTime),则您的代码将可用。

#1 楼

如果您的对象已经是DateTime了,那么您正在执行不必要的来回字符串转换。

 if (o is DateTime)
     return (DateTime)o;


这也让我感到震惊,因为您可能正在做例如,用于数据库项目。在这种情况下,我鼓励您了解并信任您的数据类型,然后使用现有的检索方法。

例如,如果您有一个带有列DataTableCreatedDate,则应该知道它是一个日期,如果该列在数据库中可为空,那么您可能不知道它是否具有值。很好,您可以用代码来处理。

 var createdDate = row.Field<DateTime?>("CreatedDate"); 


我们走了,DateTime?,无需编码转换。您甚至可以指定默认值并键入是否为DateTime

 var createdDate = row.Field<DateTime?>("CreatedDate").GetValueOrDefault(DateTime.Now);
 var createdDate = row.Field<DateTime?>("CreatedDate") ?? DateTime.Now;


#2 楼

我喜欢@ChaosPandion的解决方案,但是我发现以下内容读起来更快。

public static DateTime ObjectToDateTime(object o, DateTime defaultValue)
{    
    DateTime result;
    if (DateTime.TryParse((o ?? "").ToString(), out result)) {
        return result;
    } else {
        return defaultValue;
    }
}


如果您希望显式的空检查,请稍微修改if语句...

    if (o != null && DateTime.TryParse(o.ToString(), out result)) {


来自没有??的语言运算符,我发现它甚至更容易快速阅读和理解,但我认识到这可能只是因为我不习惯阅读??。

#3 楼

旁注

自C#7起,现在可以在is子句中声明变量,这很方便。例如

        if (o1 is DateTime startDate &&
            o2 is DateTime endDate &&
            startDate > endDate)
            return true;


评论


\ $ \ begingroup \ $
为了匹配OP代码,您还可以在TryParse()中将其显示为var dt
\ $ \ endgroup \ $
–阿德里亚诺·雷佩蒂(Adriano Repetti)
17年7月24日在16:45

#4 楼

我在这里看到的最大问题是您的方法名称。我希望ObjectToDateTime可以将我的对象解析为DateTime,但这不是完全正确的,对吗?您的方法尝试解析输入,如果不起作用,则返回默认值。您的方法名称应反映该句子。我称它为ParseDateTimeOrDefault或类似的名称。它遵循IEnumerable.SingleOrDefault趋势。

现在,还有另一个问题。您的意图似乎是将object转换为DateTime,但实际上是解析对象的ToString()

关键是,作为您方法的用户,我希望它返回默认值:

DateTime someDateTime; /*= Unimportant*/
dt = DateTime.Now;
ObjectToDateTime(dt.ToString(), someDateTime);


为什么?因为我作为参数传递的object不是DateTime,所以是string。您解析一个字符串,如果它不起作用,则返回一个值。那是您的方法。

问题是:在您的应用程序中,是否存在不知道会收到string还是DateTime的情况?因为我认为这似乎是设计缺陷。