【问题标题】:How to cast returned value of CreateInstance如何转换 CreateInstance 的返回值
【发布时间】:2011-05-09 08:03:34
【问题描述】:

当类型未知时,如何从 CreateInstance 转换返回值?

例如在这段代码中:

MethodInfo mInfo = typeof(MyType).GetMethod(MethodBase.GetCurrentMethod().Name);
Object o = Activator.CreateInstance(mInfo.ReturnType);

如何将我的 o 转换为 mInfo.ReturnType 包含的任何内容?

【问题讨论】:

  • 你打算用o做什么?我认为你不需要投射它
  • 我想用奶酪做的火箭把它送上月球。好吧,让我们假设我确实需要转换它。为什么没有任何区别。
  • 只有在您知道要将其转换为的类型时才有意义(例如,将其分配给该类型的变量)。安东的问题是合理的。
  • @Whatever - 你在辱骂,并且你在技术上......不准确。我已经编辑了你的 cmets。如果您有一个类型已知的反射用例,请显示它。
  • @Whatever - “答案”说明与 cmets 相同的内容。要求你澄清你的意图不是“噪音”。这是给出有用答案的基础。

标签: c# reflection casting createinstance


【解决方案1】:

强制转换(至少按照您通常的意思)是一种编译时/静态类型操作。 甚至在运行时对未知类型有意义的唯一方法是在处理泛型时(将其转换为一些 T - 请注意,您可以在运行时通过 @987654323 选择 T @ 或 MakeGenericType),或使用元编程(发出 IL 以进行适当的转换)。在所有其他情况下,当类型在运行时之前未知时,您会被objectdynamic 卡住。

【讨论】:

    【解决方案2】:

    通常你不能以习惯的方式这样做,除非mInfo.ReturnType 包含在编译时在当前上下文中可见的类型定义。例如,如果 mInfo.ReturnType 具有 bool 定义,您可以简单地这样做:

    bool t = (bool)o;
    

    但在这种情况下,使用 Activator 是没有意义的。当您尝试使用从另一个程序集加载的类型时,将使用 Activator 类,换句话说,该类型在编译时不可见。
    所以答案你没有办法做到这一点。

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 2020-11-14
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2020-11-15
      相关资源
      最近更新 更多