1

我正在使用 c# mvc4。每个具有创建日期成员的实体我都在我的数据库中将 DateTime 保存为 DateTime.UtcNow,我有很多视图来显示实体,并且在我的 html 中:@item.Created 重复了很多次。我希望默认的 ToString() 是 ToLocalTime,我可以在一个地方声明这个吗?可能会覆盖默认的 ToString()

4

3 回答 3

3

是的,当然您可以覆盖 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();
  }
}
于 2013-07-07T21:07:36.143 回答
1

我同意 Serv 的回答,即您不应该为 DateTime 覆盖默认的 .ToString() 并更好地使用扩展方法。只是想补充一点,您可以选择像这样使用 Property getter:

private DateTime _created;
public DateTime Created
{
    get {
        return _created.ToLocalTime();
    }
}

但在我看来 - 扩展方法将是最好的选择。

于 2013-07-07T22:51:39.227 回答
0

不,您不能覆盖.ToString().DateTime

DateTime是一个结构,而不是一个类。而且是密封的。

扩展方法是个好主意,但它不会被自动调用。您必须在需要时调用它。

你说你只想要一个地方来改变DateTime.ToString()全球的行为。没有办法做到这一点,这样做可能很危险。毕竟,您使用 UTC 值是有原因的。如果您想要本地值,请使用本地值。

我什至认为您可能能够实现这一目标的唯一方法是通过一些后期构建步骤,例如通常在PostSharp等 AOP 框架中完成。您可以编写一个进行转换的方面。但同样,我强烈建议反对这个想法。

于 2013-07-08T19:43:05.953 回答