Привести параметр 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? 12172] ОБНОВЛЕНИЕ: Спасибо за все ваши очень быстрые ответы. Этот метод (и название метода) действительно (!) Упрощен, чтобы показать именно мою проблему и позволить всем просто скопировать и вставить ее в свою визуальную студию. Это просто, что я хотел добавить некоторые специфичные для Type значения, если типом является DateTime. Кроме того, 99% метода одинаковы.

16
задан Chris 24 August 2010 в 17:04
поделиться

3 ответа

Замените его на

    return string.Format("{0:yyyy}", val);

Чтобы ответить на вопрос, компилятор не понимает, что T равно DateTime .
Чтобы выполнить это приведение, вам необходимо выполнить приведение через объект , например:

    return ((DateTime)(object)val).Year.ToString("0000");
27
ответ дан 30 November 2019 в 16:57
поделиться

SLaks печатает быстрее меня. :)

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

Если это системные типы, такие как DateTime, string.Format (), вероятно, может обрабатывать их все с соответствующими строками формата. Если это ваши собственные типы, подумайте о переопределении их методов ToString ().

В любом случае, более подробная информация о проблеме, которую вы решаете, даст интересные ответы.

1
ответ дан 30 November 2019 в 16:57
поделиться

Я знаю, что вы сказали, что пример был упрощен, но подумайте о том, как обращаться с ним следующим образом:

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, и будет использоваться общая версия для всего остального. (Вы можете даже отказаться от общего для второго и просто использовать объект)

7
ответ дан 30 November 2019 в 16:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: