C#帮我一些泛型铸造迷人
我想写一个方法将给定的对象转换为给定类型的实例。我开始与此:C#帮我一些泛型铸造迷人
private static T TryCast<T>(object o)
{
return (T) o;
}
进去,我知道那是不会工作,但它说明了这一概念。现在,当我有不会自动投射的类型时,我会开始遇到问题,如字符串 - > DateTime。我试图使用Convert类来处理这些情况,但我只是得到一个编译时错误而不是运行时错误。以下代码获取编译错误“无法投型‘字符串’的表达式类型‘T’
private static T TryCast<T>(object o)
{
var typeName = typeof (T).FullName;
switch (typeName)
{
case "System.String":
return (T) Convert.ToString(o);
default:
return (T) o;
}
}
我也知道Convert.ChangeType()的,但我不知道它是否会在处理边缘我会以其他方式处理在上述开关,就像规定字符串的情况下 - >日期时间,我会通常只使用Convert.ToDateTime为
private static T TryCast<T>(object o)
{
return (T)Convert.ChangeType(o, typeof(T));
}
那么,什么是我最好的选择。如果有人可以给?我一个可行的方法,我可以从那里拿。
Convert.ChangeType
应该处理边缘情况;它代表IConvertible
。
要回答这个问题,编译器不知道T
是string
。
因此,它不会让你在不相关的类型之间进行投射(就像你无法投射Button
到TextBox
)。
可以解决,通过铸造object
第一:
return (T)(object)o.ToString();
现在,每个单独的转换是由编译器(它要么直接向上转型或直接沮丧的)允许,你知道,整个事情将起作用,因为T
是String
。
为什么赫克没有想到这个?让我们看看其他人都说了些什么,但这可能是被接受的答案。 – 2012-03-01 16:20:56
好的,为了给出一个上下文,此方法的直接用法是从DataRow对象的列值中动态分配类型为T的实例的属性。我会传入Dictionary其中Key =实例上的属性名称,以及Value = DatRow上的列名称。我已经写了反射来从类型中获取PropertyInfos并设置实例值。这个铸造位是我最后一块拼图。我希望它尽可能重复使用,但是如果将范围限制在我的示例中使其更容易,那就这样做吧。 –
2012-03-01 16:15:17
我知道上面的第二个例子应该生成编译器错误,以及为什么。我只是用它来说明方法,谢谢。不是新的: 2012-03-01 16:26:09