【发布时间】:2013-07-07 20:34:34
【问题描述】:
我正在使用 c# mvc4。 每个具有创建日期成员的实体我都在我的数据库中将 DateTime 保存为 DateTime.UtcNow,我有很多视图来显示实体,并且在我的 html 中:@item.Created 重复了很多次。我希望默认的 ToString() 是 ToLocalTime,我可以在一个地方声明这个吗?可能会覆盖默认的 ToString()
【问题讨论】:
我正在使用 c# mvc4。 每个具有创建日期成员的实体我都在我的数据库中将 DateTime 保存为 DateTime.UtcNow,我有很多视图来显示实体,并且在我的 html 中:@item.Created 重复了很多次。我希望默认的 ToString() 是 ToLocalTime,我可以在一个地方声明这个吗?可能会覆盖默认的 ToString()
【问题讨论】:
是的,当然你可以重写 ToString() 方法。
请参阅http://msdn.microsoft.com/en-us/library/ms173154(v=vs.80).aspx 以获取更多参考。
但是 - 我建议使用扩展方法来实现您的需求,因为您可以在其他地方使用默认的 ToString() 扩展。
/更新: 使用允许日期时间为空值的扩展方法(总是出错)。您可以在每个 DateTime 值上调用它。然后该方法检查它是否为空。在这种情况下,它返回一个 string.empty,否则返回您喜欢的格式的日期时间。
public static string ToLocalString(this DateTime? date)
{
if(date == null)
{
return String.Empty;
}
else
{
return date.ToLocalString().ToString();
}
}
【讨论】:
我同意 Serv 的回答,即您不应该为 DateTime 覆盖默认的 .ToString() 并更好地使用扩展方法。只是想补充一点,您可以选择像这样使用 Property getter:
private DateTime _created;
public DateTime Created
{
get {
return _created.ToLocalTime();
}
}
但在我看来 - 扩展方法将是最好的选择。
【讨论】:
不,您不能在 DateTime 上覆盖 .ToString()。
DateTime 是一个结构,而不是一个类。而且是密封的。
扩展方法是个好主意,但它不会被自动调用。您必须在需要时调用它。
你说你只是想要一个地方来改变全球DateTime.ToString() 的行为。没有办法做到这一点,这样做可能很危险。毕竟,您使用 UTC 值是有原因的。如果您想要本地值,请使用本地值。
我什至认为您可能能够实现此目的的唯一方法是通过一些后期构建步骤,例如在 AOP 框架中通常完成的操作,如 PostSharp。您可以编写一个 aspect 来进行转换。但是,我再次强烈建议您反对这个想法。
【讨论】: