C#帮我做一些普通的演员表演
我正在尝试编写一个方法,用于将给定对象转换为给定类型的实例。我从这个开始:C#帮我做一些普通的演员表演,c#,generics,casting,C#,Generics,Casting,我正在尝试编写一个方法,用于将给定对象转换为给定类型的实例。我从这个开始: private static T TryCast<T>(object o) { return (T) o; } private static T TryCast(对象o) { 返回(T)o; } 我知道这是行不通的,但它说明了这个概念。现在,当我有无法自动强制转换的类型时,我将开始遇到问题,比如字符串-->日期时间。我试图使用Convert类来处理这些情况,但我只得到了一个编译时错误,而不是运行时
private static T TryCast<T>(object o)
{
return (T) o;
}
private static T TryCast(对象o)
{
返回(T)o;
}
我知道这是行不通的,但它说明了这个概念。现在,当我有无法自动强制转换的类型时,我将开始遇到问题,比如字符串-->日期时间。我试图使用Convert类来处理这些情况,但我只得到了一个编译时错误,而不是运行时错误。以下代码获取编译错误“无法将'string'类型的表达式强制转换为'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;
}
}
private static T TryCast(对象o)
{
var typeName=typeof(T).FullName;
开关(类型名称)
{
案例“System.String”:
返回(T)转换为字符串(o);
违约:
返回(T)o;
}
}
我也知道Convert.ChangeType(),但我想知道它是否能处理我在上述开关中处理的边缘情况,比如我通常只使用Convert.ToDateTime处理的指定字符串-->DateTime
private static T TryCast<T>(object o)
{
return (T)Convert.ChangeType(o, typeof(T));
}
private static T TryCast(对象o)
{
return(T)Convert.ChangeType(o,typeof(T));
}
那么,我最好的选择是什么?如果有人能给我一个可行的方法,我可以从那里开始。
Convert.ChangeType
应该处理边缘情况;它委托给IConvertible
为了回答这个问题,编译器不知道t
是string
因此,它不允许您在不相关的类型之间进行强制转换(就像您不能将
按钮
强制转换为文本框
)
您可以通过首先强制转换到对象来解决此问题:
return (T)(object)o.ToString();
现在,编译器允许每个单独的转换(可以是直接向上转换,也可以是直接向下转换),并且您知道整个过程都会起作用,因为T
是String
好的,为了提供一点上下文,此方法的直接用法是根据DataRow对象中的列值在T类型的实例上动态分配属性DatRow上的名称。我已经编写了反射,以从类型中获取PropertyInfo并设置实例值。此铸造位是我的最后一块拼图。我希望它尽可能可重用,但如果将您的范围限制在我的示例中会更容易,那么就这样吧。我知道上面的第二个示例应该生成compiler错误,以及原因。我只是用它来说明方法,谢谢。不是那么新鲜:我为什么没想到这个?让我们看看其他人怎么说,但这可能是公认的答案。