Ваш код предполагает, что переменная может быть либо датой, либо строкой, которая выглядит как дата. Даты, которые вы можете просто вернуть с приведением, но строки должны быть проанализированы. Синтаксический анализ происходит с двумя оговорками:
если вы не уверены, что эту строку можно проанализировать, используйте DateTime.TryParse()
.
Всегда включайте ссылку на культуру, которую вы хотите проанализировать. ToShortDateString()
возвращает разные выходы в разных местах. Вы почти наверняка захотите разобрать, используя ту же культуру. Я предлагаю эту функцию для обеих ситуаций;
private DateTime ParseDateTime(object data)
{
if (data is DateTime)
{
// already a date-time.
return (DateTime)data;
}
else if (data is string)
{
// it's a local-format string.
string dateString = (string)data;
DateTime parseResult;
if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture,
DateTimeStyles.AssumeLocal, out parseResult))
{
return parseResult;
}
else
{
throw new ArgumentOutOfRangeException("data",
"could not parse this datetime:" + data);
}
}
else
{
// it's neither a DateTime or a string; that's a problem.
throw new ArgumentOutOfRangeException("data",
"could not understand data of this type");
}
}
Тогда звоните вот так;
ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString();
Обратите внимание, что неверные данные выдают исключение, поэтому вы захотите его уловить.
Также; оператор «as» не работает с типом данных DateTime, поскольку он работает только со ссылочными типами, а DateTime является типом значения.