我的方案应该是简单的...我想要转换的类型FROM是ALWAYS "字符串".我想要转换为...可能是很多东西 - 整数,日期时间,...字符串等.
这很容易:
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"...任何建议?
干净的方法是使用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 :/ }
蒂莫西的问题,一般适用于.NET中的类型转换问题,是一个非常大的问题.虽然在具有已知类型的特定场景中转换策略有点简单,但不幸的是,在任何.NET实现中都没有通用策略来在运行时从一个任意类型到另一个类型完成类型转换,Redmond也不会提出这样的策略.但是,Microsoft为类型转换的一般概念提供了一些很好的指导,包括:
在.NET Framework中键入转换
转换和类型转换(C#编程指南)
TypeConverters和XAML
我不得不在我的系统中处理同样的一般问题,作为一种解决方案,我将所有标准策略合并到一个方法中.此问题的范围很广,相关的转换策略也各不相同,因此这种整合方法只能在完整的技术文章中介绍.但是,我在这里提供了我的方法文档的副本,希望这可以帮助您牢牢掌握如果要开发类似的通用解决方案需要解决的总体要求.这是我的文档的链接:
ConvertType方法
我希望这可以帮助你,
标记