2013-07-07 3 views
1

Я использую C# mvc4. Каждый объект с созданием члена даты Я сохраняю DateTime в моей БД как DateTime.UtcNow, у меня есть много просмотров, чтобы показать объекты и в моем html: @ item.Created многократно. Я хочу, чтобы по умолчанию ToString() был ToLocalTime, есть ли одно место, я могу объявить это? возможно переопределить значение по умолчанию ToString()set datetime to string to ToLocalTime

ответ

0

Нет, вы не можете переопределить .ToString() на DateTime.

DateTime - это структура, а не класс. И это запечатано.

Метод расширения - хорошая идея, но он не будет вызван автоматически. Вы должны называть это, когда вам это нужно.

Вы сказали, что хотите просто поменять поведение DateTime.ToString() по всему миру. Невозможно это сделать, и, вероятно, было бы опасно это сделать. В конце концов, вы используете значения UTC по какой-то причине. Если вам нужны локальные значения, используйте локальные значения.

Единственный способ, я могу даже думать, что вы можете достичь этого, с некоторым шагом после сборки, например, обычно выполняются в рамках AOP, таких как PostSharp. Вы можете написать аспект , который делает преобразование. Но опять же, я настоятельно рекомендую против этой идеи в целом.

3

Да, конечно, вы можете переопределить метод ToString().

См. http://msdn.microsoft.com/en-us/library/ms173154(v=vs.80).aspx для получения дополнительной информации.

Однако - я рекомендую использовать метод расширения, чтобы реализовать вашу потребность, потому что вы могли бы использовать расширение ToString() по умолчанию в другом месте.

/Обновление: Использование метода расширения, позволяющего datetime быть нулевым значением (что-то всегда идет не так). Вы можете вызвать это при каждом значении DateTime. Затем метод проверяет, имеет ли он значение null. В этом случае он возвращает string.empty, иначе Datetime в формате, который вам нравится.

public static string ToLocalString(this DateTime? date) 
{ 
    if(date == null) 
    { 
    return String.Empty; 
    } 
    else 
    { 
    return date.ToLocalString().ToString(); 
    } 
} 
+0

Я хочу, чтобы одно место объявляло переопределение, только одно место для всего проекта foreach DateTime-вызов ToString, я хочу, чтобы оно было ToLocalTime, а затем ToString –

1

Я согласен с ответом Serv, что вы не должны переопределить по умолчанию .ToString() для DateTime и лучшего метода расширения использования. Просто хотел бы добавить, что у вас есть возможность использовать поглотитель собственности, как это:

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

Но на мой взгляд - метод расширения будет лучшим вариантом.