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

Chr*_*ris 16 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

在演员"(DateTime)val"我得到以下错误:

无法将类型'T'的表达式转换为'DateTime'类型

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

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

SLa*_*aks 27

将其更改为

    return string.Format("{0:yyyy}", val);
Run Code Online (Sandbox Code Playgroud)

为了回答这个问题,编译器没有意识到这T一点DateTime.
要执行此强制转换,您需要强制转换object,如下所示:

    return ((DateTime)(object)val).Year.ToString("0000");
Run Code Online (Sandbox Code Playgroud)

  • 当然,如果您通过对象进行投射,则会进行装箱和拆箱步骤. (5认同)

Jam*_*ran 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; 
} 
Run Code Online (Sandbox Code Playgroud)

当传递实际的DateTime时,DateTime重载是最佳匹配,并且通用版本将用于覆盖其他.(你甚至可以为第二个放弃泛型,只使用一个Object)