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

前端之家收集整理的这篇文章主要介绍了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>之类的接口的某种类型的参数

无论如何,最好的运气.

猜你在找的C#相关文章