如何在运行时转换类型?

如何在运行时转换类型?

问题描述:

我的方案应该是简单的......我想转换FROM类型是总是“串”。我想转换为...可能是很多东西 - 整型,DateTime是否......字符串等如何在运行时转换类型?

这会很容易:

string valueToConvertFrom = "123"; 

int blah = Convert.ToInt32(valueToConvertFrom); 

不过......我不知道(直到运行时),我需要转换的值是'Int'(或其他)。我试过这个:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

object blah = Convert.ChangeType(valueToConvertFrom, convertToType); 

但是,这给了我以下错误:“对象必须实现IConvertible。”

我不想要做一个switch语句,并呼吁“Convert.ToBlah”的基础上的类型名称...有什么建议?

+0

请重新打开并添加您找到了答案,万一别人有未来相同或类似的问题 – 2008-11-23 19:50:29

+1

我之所以关闭它,是因为我的代码中有一个错误...我最初从错误的领域拉,而且该领域没有实现IConvertible。 +1两个答案...“字符串类实现IConvertible,这个代码简单地应该工作”这是真的。但是Asher的解决方案非常棒,因为我学到了一些新东西(这是一个非常干净的解决方案)。再次感谢! – 2008-11-24 12:43:51

干净的做法是使用TypeConverter。 通过调用TypeDescriptor.GetConverter,然后使用类型转换器的实例进行转换,可以获得类型转换器的实例。 所以是这样的:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

TypeConverter tc = TypeDescriptor.GetConverter(convertToType);    

object blah =tc.ConvertFromString(valueToConvertFrom); 

String类实现IConvertible,这个简单的代码应该工作。你瞄准哪个版本的.NET?

object o = Convert.ChangeType(str, convertToType); 

另外,你提到的大多数类型实现了Parse方法,所以你最好的镜头可能是这样的。

Type convertToType = ...; 
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static); 
object blah; 
if(mi != null) 
{ 
    blah = mi.Invoke(null, new object[]{valueToConvertFrom}); 
} 
else 
{ 
    // the type doesn't implement the Parse method, handle it another way :/ 
} 
+2

这看起来就像一个黑客... – Asher 2008-11-23 20:16:04

提摩太的问题,因为一般适用于.NET类型转换的问题,是一个非常大的问题。尽管在具有已知类型的特定场景中转换策略有些简单,但不幸的是,在.NET的任何实现中,没有一种通用策略可以在运行时从一个任意类型到另一个类型实现类型转换,这种策略也不是雷蒙德即将推出的。然而,微软提供了一些很好的指导方针进行类型转换的总体思路,包括:

我不得不应对相同的一般问题,我系统,并且作为一种解决方案,我已将所有标准策略整合为一种方法。这个问题的范围很广泛,相关的转换策略也各不相同,所以这种综合方法只能在一篇完整的技术文章中介绍。不过,我在这里提供了我的方法文档的副本,希望这将有助于您牢牢掌握需要解决的整体需求,以便开发类似的通用解决方案。这里的链接到我的文档:

我希望这可以帮助你,

马克