当前位置:  开发笔记 > 编程语言 > 正文

如何在运行时转换类型?

如何解决《如何在运行时转换类型?》经验,为你挑选了3个好方法。

我的方案应该是简单的...我想要转换的类型FROMALWAYS "字符串".我想要转换为...可能是很多东西 - 整数,日期时间,...字符串等.

这很容易:

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"...任何建议?



1> Asher..:

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

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);


Asher的答案不适用于Silverlight(web或WP7x),其中TypeDescriptor不可用.此外,TypeDescriptor仅为已定义TypeConverter的Type返回TypeConverter,该TypeConverter不会自动应用于大多数类型.TypeDescriptor返回的TypeConverter只是为给定Type定义的第一个TypeConverter.因此,至少可以说,您通常不能依赖TypeDescriptor进行转换.

2> arul..:

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> Mark Jones..:

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

在.NET Framework中键入转换

转换和类型转换(C#编程指南)

TypeConverters和XAML

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

ConvertType方法

我希望这可以帮助你,

标记

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有