【问题标题】:Cast to a type from the type name as a string将类型名称作为字符串转换为类型
【发布时间】:2016-03-17 16:58:50
【问题描述】:

我有一个现有的基类型,我想根据类型名称作为字符串将其转换为派生类型,所以像这样:

public void DoStuffInDerivedType(string derivedName) {
   (base as Type.GetType(derivedName)).DoThisThing();
}

我很确定这无法完成,但很高兴知道这一点。谢谢

编辑:我知道我可以使用类型名称的反射构造对象,但我想使用现有对象。而且我知道这通常是一个坏主意。但是我想将其用于 SpecFlow BDD 功能。

【问题讨论】:

  • 考虑使用Relection
  • 为什么要投?你不能动态调用它吗?例如((dynamic)this).DoThisThing();
  • 如果derivedName 在编译时不知道,编译器如何检查DoThisThing 是否是所有可能的derivedNames 上的有效方法,您可以传递给该方法?你为什么要做演员?您是否考虑过使用虚拟方法/接口?
  • 现有哪些对象?你能提供一个更好的代码示例吗?试着解释你为什么要这样做。
  • @Luaan 这是一个 BBD 测试,所以类型名称是来自功能文件的字符串。

标签: c# .net reflection casting


【解决方案1】:

我会重复你可能不需要这样做的建议,但是因为我以前做过这个操作:

Convert.ChangeType(ItemToCast, Type.GetType(stringNameOfType)))

应该适合你。

【讨论】:

  • 这很好,但它只有在对象实现IConvertible 时才有效。不幸的是,像 Exception 这样的类没有。
  • 我必须在前面加一个演员表,这几乎让你回到输入类型,这让你回到第一格。我错过了什么吗?
【解决方案2】:

我认为您需要将其转换为派生类型。您应该能够将其转换为基类型并使用共享接口(无论是基类还是文字接口)来执行您想做的任何事情。

如果没有,请考虑将行为添加为接口要求,以便您可以那样做。

最后:您需要这样做的一种可能性是,如果您要覆盖演员表...在这种情况下,我几乎可以肯定您不能这样做没有一些繁重的反射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2023-02-08
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多