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;
}
代码感觉太冗长,而且味道不好。有更好的方法吗?
#1 楼
如果您的对象已经是DateTime
了,那么您正在执行不必要的来回字符串转换。 if (o is DateTime)
return (DateTime)o;
这也让我感到震惊,因为您可能正在做例如,用于数据库项目。在这种情况下,我鼓励您了解并信任您的数据类型,然后使用现有的检索方法。
例如,如果您有一个带有列
DataTable
的CreatedDate
,则应该知道它是一个日期,如果该列在数据库中可为空,那么您可能不知道它是否具有值。很好,您可以用代码来处理。 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
的情况?因为我认为这似乎是设计缺陷。
评论
您可以摆脱“其他”(因为在真实情况下它已经返回),但这并没有太大的改进。除此之外,对我来说,这似乎是最佳的选择。返回o作为DateTime? defaultValue;
DateTime是一种值类型,因此不能与as运算符一起使用,也不能设置为null。那将是无效的代码。
正如@Jeff Mercado所说,您不能将DateTime对象与as关键字一起使用。转换失败不能设置为null。但是,如果使用DateTime? (可为空的DateTime),则您的代码将可用。