【问题标题】:How Can I Convert Types at Runtime?如何在运行时转换类型?
【发布时间】:2010-09-23 16:39:44
【问题描述】:

我的场景应该很简单...我要转换的类型 FROMALWAYS '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”...有什么建议吗?

【问题讨论】:

  • 请重新打开并添加您找到的答案,以防其他人将来遇到相同或类似的问题
  • 我关闭它的原因是因为我的代码中有一个错误......我最初是从错误的字段中提取的,并且该字段没有实现 IConvertible。两个答案+1...“字符串类实现IConvertible,此代码应该可以工作”这是真的。但是 Asher 的解决方案很棒,因为我学到了一些新东西(而且这是一个非常干净的解决方案)。再次感谢!

标签: .net reflection runtime type-conversion


【解决方案1】:

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

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);

【讨论】:

  • 这太棒了。非常感谢!
  • Asher 的回答不适用于 TypeDescriptor 不可用的 Silverlight(网络或 WP7x)。此外,TypeDescriptor 只为定义了 TypeConverter 的 Type 返回一个 TypeConverter,它不会自动应用于大多数 Type。 TypeDescriptor 返回的 TypeConverter 只是为给定 Type 定义的第一个。因此,至少可以说,您通常不能依赖 TypeDescriptor 进行转换。
  • 还要记住,TypeConverter 不仅是一个抽象基类,如果您使用它进行自定义类转换,它不仅需要自定义实现,而且它也比其他机制相对慢,因为它是基于反射/发现的。
  • 有人可以重申或提供更多信息,如果在自定义类(例如客户或订单)上使用 TypeConverter,该类必须实现 IConvertable 才能工作?如果是的话,我仍然不知道如何使用实现的方法在自定义类型之间进行转换。
【解决方案2】:

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 :/
}

【讨论】:

    【解决方案3】:

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

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

    希望对你有帮助

    标记

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多