我正在使用c#mvc4。 每个具有创建日期成员的实体我将DateTime保存在我的数据库中作为DateTime.UtcNow,我有很多视图来显示实体和我的html:@ item.Created重复多次。我想要默认的ToString()将是ToLocalTime,有一个地方我可以声明这个吗?也许会覆盖默认的ToString()
答案 0 :(得分:3)
是的,你当然可以覆盖ToString()方法。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms173154(v=vs.80).aspx。
但是 - 我建议使用扩展方法来实现您的需要,因为您可以在其他地方使用默认的ToString()扩展名。
/更新: 使用扩展方法允许datetime为空值(总是出错)。您可以在每个DateTime值上调用它。然后该方法检查它是否为空。在这种情况下,它返回一个string.empty,否则以您喜欢的格式返回Datetime。
public static string ToLocalString(this DateTime? date)
{
if(date == null)
{
return String.Empty;
}
else
{
return date.ToLocalString().ToString();
}
}
答案 1 :(得分:1)
我同意Serv的回答,你不应该为DateTime覆盖默认.ToString()并更好地使用扩展方法。只是想补充一点,您可以选择使用Property getter,如下所示:
private DateTime _created;
public DateTime Created
{
get {
return _created.ToLocalTime();
}
}
但在我看来 - 扩展方法将是最佳选择。
答案 2 :(得分:0)
不,您无法覆盖.ToString()
上的DateTime
。
DateTime
是一个结构,而不是一个类。它是密封的。
扩展方法是个好主意,但不会自动调用。您必须在需要时拨打电话。
你说你只想要一个地方来全局改变DateTime.ToString()
的行为。没有办法做到这一点,这样做可能会很危险。毕竟,您使用UTC值是有原因的。如果您想要本地值,请使用本地值。
我认为你可以实现这一目标的唯一方法是使用一些后期构建步骤,例如通常在像PostSharp这样的AOP框架中完成的步骤。您可以编写一个执行转换的方面。但同样,我强烈建议反对这个想法。