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’.
解决方法
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>之类的接口的某种类型的参数
无论如何,最好的运气.