c# – 扩展Convert.ChangeType以根据请求生成用户定义的类型

给定类:
public class Foo
{
    public string Name { get; set; }
}

可以通过Convert.ChangeType从一个字符串创建一个Foo实例:

Type type = typeof(Foo);
object value = "one";

value = System.Convert.ChangeType(value,type);

这是第三方API如何尝试重建对象.有人提到这是可能的隐式运算符,但从我的理解,将让我做以下,不创建对象:

Foo foo = new Foo() { Name = "one" };
string fooAsstring = foo;  // implicit conversion -- no cast needed

有没有办法以这种方式创建对象?另外,如果有另一种方法,我确实有能力更改Convert.ChangeType.

更新:
我问的原因是因为它抛出异常:

Invalid cast from ‘System.String’ to
jibbaJabba+Foo’.

并且添加运算符没有解决问题.

解决方法

根据 the MSDN documentation

For the conversion to succeed,value
must implement the IConvertible
interface,because the method simply
wraps a call to an appropriate
07001 method. The method
requires that conversion of value to
conversionType be supported.

看看IConvertible界面,它有一个ToType方法.你可以试试,也许(免责声明:我没有,只是一个想法.)

编辑:在你的情况下,你似乎想将一个字符串转换一个Foo.由于字符串类型(显然)不会在其IConvertible实现定义转换到富,我相信你的运气了.

更新:我不想建议这是你应该总是处理这种问题,但…

我在Reflector看了Convert.ChangeType的代码.我不会在这里重现.但是基本上它的做法正如文档所说:它只适用于:

> value参数是实现IConvertible的类型的非空实例,或者:
> value参数和conversionType参数的类型是相同的(所以:Convert.ChangeType(myFoo,typeof(Foo))也可以正常工作,尽管这是非常无用的).

然后,它循环通过IConvertible支持的所有类型(显然不包括任何用户定义的类型),并最终使用ToType作为后备.

所以,我们需要看看字符串类型的ToType的实现.

可悲的是,这是一个不幸的路线:

return Convert.DefaultToType(this,type,provider);

DefaultToType做什么?与ChangeType完全相同(减去ToType回退,显然是为了避免无限递归).

所以这只是不行.

如果您绝对遵守在场景中使用Convert.ChangeType的第三方库,我建议您联系图书馆的开发人员,并要求他们以某种方式扩展其API,以便您完成您要完成的任务.一些可能性可能是:

>接受可选的转换器< string,T>或Func< string,T>由Ben Voigt在评论中提出的委托参数.
>接受TypeConverter参数
>接受实现如IParser< T>之类的接口的某种类型的参数

无论如何,最好的运气.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...