У меня есть следующий (упрощенный) метод:
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? 12172] ОБНОВЛЕНИЕ: Спасибо за все ваши очень быстрые ответы. Этот метод (и название метода) действительно (!) Упрощен, чтобы показать именно мою проблему и позволить всем просто скопировать и вставить ее в свою визуальную студию. Это просто, что я хотел добавить некоторые специфичные для Type значения, если типом является DateTime. Кроме того, 99% метода одинаковы.
Замените его на
return string.Format("{0:yyyy}", val);
Чтобы ответить на вопрос, компилятор не понимает, что T
равно DateTime
.
Чтобы выполнить это приведение, вам необходимо выполнить приведение через объект
, например:
return ((DateTime)(object)val).Year.ToString("0000");
SLaks печатает быстрее меня. :)
Но позвольте мне добавить: вы можете пересмотреть свою реализацию здесь, в зависимости от того, чего вы пытаетесь достичь. Я предполагаю, что причиной использования универсального метода GetStringFromValue является генерирование определенных строк из различных типов. Но это закончится небольшим беспорядком, когда у вас будет, скажем, дюжина разных типов.
Если это системные типы, такие как DateTime, string.Format (), вероятно, может обрабатывать их все с соответствующими строками формата. Если это ваши собственные типы, подумайте о переопределении их методов ToString ().
В любом случае, более подробная информация о проблеме, которую вы решаете, даст интересные ответы.
Я знаю, что вы сказали, что пример был упрощен, но подумайте о том, как обращаться с ним следующим образом:
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, и будет использоваться общая версия для всего остального. (Вы можете даже отказаться от общего для второго и просто использовать объект)