我有以下(简化)方法:
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%的方法是相同的。
答案 0 :(得分:25)
将其更改为
return string.Format("{0:yyyy}", val);
要回答这个问题,编译器没有意识到T
是DateTime
要执行此强制转换,您需要强制转换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()方法。
无论哪种方式,关于你正在解决的问题的更多细节都会得到有趣的答案。