如何在运行时转换类型?

时间:2008-11-23 19:37:13

标签: .net reflection runtime type-conversion

我的场景应该很简单......我想要转换 FROM 的类型是总是'string'。我想要转换为...可以是很多东西 - 整数,日期时间,...字符串等。

这很简单:

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”......有什么建议吗?

3 个答案:

答案 0 :(得分:30)

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

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);

答案 1 :(得分:5)

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 :(得分:5)

Timothy的问题,一般应用于.NET中的类型转换问题,是一个非常大的问题。虽然在具有已知类型的特定场景中转换策略有点简单,但不幸的是,在任何.NET实现中都没有通用策略来在运行时从一个任意类型到另一个类型完成类型转换,Redmond也不会提出这样的策略。但是,Microsoft为类型转换的一般概念提供了一些很好的指导,包括:

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

我希望这可以帮助你,

标记