21

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

这很容易:

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

4

3 回答 3

30

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

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);
于 2008-11-23T20:15:28.120 回答
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 :/
}
于 2008-11-23T20:04:47.377 回答
5

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

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

我希望这可以帮助你,

标记

于 2011-10-29T23:32:50.350 回答