给定类:
我问的原因是因为它抛出异常:
public class Foo { public string Name { get; set; } }@H_301_4@可以通过Convert.ChangeType从一个字符串创建一个Foo实例:
Type type = typeof(Foo); object value = "one"; value = System.Convert.ChangeType(value,type);@H_301_4@这是第三方API如何尝试重建对象.有人提到这是可能的隐式运算符,但从我的理解,将让我做以下,不创建对象:
Foo foo = new Foo() { Name = "one" }; string fooAsString = foo; // implicit conversion -- no cast needed@H_301_4@有没有办法以这种方式创建对象?另外,如果有另一种方法,我确实有能力更改Convert.ChangeType. @H_301_4@更新:
我问的原因是因为它抛出异常:
@H_301_4@Invalid cast from ‘System.String’ to@H_301_4@并且添加运算符没有解决问题.
‘JibbaJabba+Foo’.
解决方法
根据
the MSDN documentation:
> value参数和conversionType参数的类型是相同的(所以:Convert.ChangeType(myFoo,typeof(Foo))也可以正常工作,尽管这是非常无用的). @H_301_4@然后,它循环通过IConvertible支持的所有类型(显然不包括任何用户定义的类型),并最终使用
>接受
>接受实现如IParser< T>之类的接口的某种类型的参数 @H_301_4@无论如何,最好的运气.
@H_301_4@For the conversion to succeed,value@H_301_4@看看IConvertible界面,它有一个
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.
ToType
的方法.你可以试试,也许(免责声明:我没有,只是一个想法.)
@H_301_4@编辑:在你的情况下,你似乎想将一个字符串转换成一个Foo.由于字符串类型(显然)不会在其IConvertible实现定义转换到富,我相信你的运气了.
@H_301_4@更新:我不想建议这是你应该总是处理这种问题,但…
@H_301_4@我在Reflector看了Convert.ChangeType的代码.我不会在这里重现.但是基本上它的做法正如文档所说:它只适用于:
@H_301_4@> value参数是实现IConvertible的类型的非空实例,或者:> value参数和conversionType参数的类型是相同的(所以:Convert.ChangeType(myFoo,typeof(Foo))也可以正常工作,尽管这是非常无用的). @H_301_4@然后,它循环通过IConvertible支持的所有类型(显然不包括任何用户定义的类型),并最终使用
ToType
作为后备.
@H_301_4@所以,我们需要看看字符串类型的ToType的实现.
@H_301_4@可悲的是,这是一个不幸的路线:
return Convert.DefaultToType(this,type,provider);@H_301_4@DefaultToType做什么?与ChangeType完全相同(减去ToType回退,显然是为了避免无限递归). @H_301_4@所以这只是不行. @H_301_4@如果您绝对遵守在场景中使用Convert.ChangeType的第三方库,我建议您联系图书馆的开发人员,并要求他们以某种方式扩展其API,以便您完成您要完成的任务.一些可能性可能是: @H_301_4@>接受可选的转换器< string,T>或Func< string,T>由Ben Voigt在评论中提出的委托参数.
>接受
TypeConverter
参数>接受实现如IParser< T>之类的接口的某种类型的参数 @H_301_4@无论如何,最好的运气.