将泛型方法中的T参数转换为DateTime

时间:2010-08-24 16:47:12

标签: c# .net generics casting

我有以下(简化)方法:

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'

如何访问DateTime参数的Year属性?

更新:感谢您提供所有非常快速的答案。这个方法(和方法名称)实际上是(!)简化,以准确显示我的问题,并让每个人只需将其复制并粘贴到他自己的视觉工作室。如果类型是DateTime,我只想添加一些Type特定值。除此之外,99%的方法是相同的。

3 个答案:

答案 0 :(得分:25)

将其更改为

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

要回答这个问题,编译器没有意识到TDateTime 要执行此强制转换,您需要强制转换object,如下所示:

    return ((DateTime)(object)val).Year.ToString("0000");

答案 1 :(得分:7)

我知道你说这个例子是简化的,但考虑像这样处理它:

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重载是最佳匹配,并且通用版本将用于覆盖其他。 (你甚至可以为第二个放弃泛型,只使用一个对象)

答案 2 :(得分:1)

SLaks类型比我更快。 :)

但是,让我补充一点:您可能希望在此处重新考虑您的实施,具体取决于您要实现的目标。我假设有一个通用的GetStringFromValue方法的原因是从各种类型发出特定的字符串。但是,一旦你拥有十几种不同类型的东西,那将会有点混乱。

如果它们是系统类型,例如DateTime,则string.Format()可以使用适当的格式字符串处理所有这些类型。如果它们是您自己的类型,请考虑覆盖它们的ToString()方法。

无论哪种方式,关于你正在解决的问题的更多细节都会得到有趣的答案。