gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:40:29 24 4
gpt4 key购买 nike

给定类(class):

public class Foo
{
public string Name { get; set; }
}

是否可以通过 Convert.ChangeType 从字符串创建 Foo 实例:
Type type = typeof(Foo);
object value = "one";

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

这就是第 3 方 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 IConvertible method. The method requires that conversion of value to conversionType be supported.



看着 IConvertible接口(interface),它有一个 ToType 方法。你可以试试,也许? (免责声明:我没有。这只是一个想法。)

编辑 :在您的情况下,您似乎想从 string 转换到 Foo .由于 string类型(显然)没有定义到 Foo 的转换在其 IConvertible实现,我相信你不走运。

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

我查看了 Convert.ChangeType 的代码在 Reflector .它的长;我不会在这里复制它。但基本上它就像文档所说的那样:它仅在以下情况下才有效:
  • value参数是实现 IConvertible 的类型的非空实例, 或:
  • value 的类型参数和 conversionType参数是相同的(所以:Convert.ChangeType(myFoo, typeof(Foo)) 也可以,尽管它非常没用)。

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

    所以,我们需要查看 string ToType 的类型实现.

    可悲的是,这是一条不幸的线:
    return Convert.DefaultToType(this, type, provider);
    DefaultToType 是什么意思做?和 ChangeType 完全一样(减去 ToType 后备,显然是为了避免无限递归)。

    所以这根本行不通。

    如果您完全依赖于使用 Convert.ChangeType 的第 3 方库在幕后,我建议联系库的开发人员并要求他们以某种方式扩展他们的 API,以便您完成您想要完成的事情。一些可能性可能是:
  • 接受可选的 Converter<string, T>Func<string, T>委托(delegate)参数,正如 Ben Voigt 在评论中所建议的那样。
  • 接受 TypeConverter 参数
  • 接受某种类型的参数,该参数实现了像 IParser<T> 这样的接口(interface)

  • 无论如何,祝你好运。

    关于c# - 扩展 Convert.ChangeType 以根据请求生成用户定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3847446/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com