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)
我知道你说这个例子是简化的,但考虑像这样处理它:
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)