Параметр Cast T в универсальном методе DateTime
У меня есть следующий (упрощенный) метод:
private static string GetStringFromValue<T>(T val)
{
if (typeof(T) == typeof(DateTime))
{
return string.Format("{0}", ((DateTime)val).Year.ToString("0000"));
}
return string.Empty;
}
В литье "(DateTime) val" Я получаю следующую ошибку:
Нельзя выразить выражение типа 'T' для ввода 'DateTime'
Что я могу сделать для доступа к свойству Year параметра DateTime?
ОБНОВЛЕНИЕ: Благодарим вас за все ваши быстрые ответы. Этот метод (и имя метода) действительно (!) Упрощен, чтобы точно показать мою проблему и позволить всем просто скопировать и вставить его в свою собственную визуальную студию. Просто я хотел добавить некоторые конкретные значения типа, если тип DateTime. Кроме того, 99% метода одинаково.
Ответы
Ответ 1
Измените его на
return string.Format("{0:yyyy}", val);
Чтобы ответить на вопрос, компилятор не понимает, что T
есть DateTime
.
Чтобы выполнить этот отбор, вам нужно выполнить object
, например:
return ((DateTime)(object)val).Year.ToString("0000");
Ответ 2
Я знаю, что вы сказали, что пример был упрощен, но подумайте над этим:
private static string GetStringFromValue(DateTime val)
{
return string.Format("{0}", val.Year.ToString("0000"));
}
private static string GetStringFromValue<T>(T val)
{
return string.Empty;
}
Перегрузка DateTime является наилучшим совпадением, когда передается фактическое DateTime, а общая версия будет использоваться для чего-то еще. (Вы даже можете отказаться от общего для второго и просто использовать Object)
Ответ 3
SLaks быстрее, чем я.:)
Но позвольте мне добавить: вы можете подумать о своей реализации, здесь, в зависимости от того, чего вы пытаетесь достичь. Я предполагаю, что причиной того, что общий метод GetStringFromValue должен испускать определенные строки из разных типов. Но это будет немного беспорядком, если у вас есть, скажем, дюжина различных типов.
Если они являются системными типами, такими как DateTime, string.Format(), вероятно, может обрабатывать все из них с соответствующими строками формата. Если они являются вашими собственными типами, рассмотрите возможность переопределения их методов ToString().
В любом случае, более подробная информация о проблеме, которую вы решаете, сделает интересными ответы.