【问题标题】:Is there a straightforward way to copy a Type using reflection?有没有一种使用反射复制类型的简单方法?
【发布时间】:2011-04-16 21:56:20
【问题描述】:

我意识到这是一个非常奇怪的问题。我只想说我有我的理由。 (我倾向于写很长、很冗长的问题;我希望这个问题简短。)

如果我有一些类型T,我可以使用反射来定义一个新类型,我们称之为T2,它基本上与T 相同吗?我正在寻找的本质上是一种动态方式,它相当于我在两个单独的源代码文件中编写完全相同的代码(类名除外)并编译两者时的结果。

【问题讨论】:

  • 您是在尝试按照@Kirk Woll 的建议将发出的类型转换为 CS 代码文件,还是只是尝试动态生成和使用该类型?

标签: .net reflection dynamic types reflection.emit


【解决方案1】:

我认为没有什么灵丹妙药可以为您完成工作,但您可以使用 Reflection Emit 来完成。

这里是 a nice tutorial 部分主题。从那里开始,然后向上移动到一些sister articles

【讨论】:

  • 这是问题的 50%。但是他是怎么把目标类型的代码out弄出来的呢?
  • @Kirk Woll:你确定这就是他想要的吗?我读到的问题是他想动态生成和使用类型,而不是创建代码。
  • @Randolpho,我的看法是 OP 想要一个 System.Type 并创建一个新的 System.Type ,它是原始的镜像。由于这个过程不会涉及任何源代码,我很好奇他会在哪里发出 IL?
  • @Randolpho,@Kirk:你们都是对的。我认为柯克的观点是,您的答案没有解决从源类型中提取更详细的类型信息(例如,构造函数、方法等的 IL)以发射到目标类型的问题。但是,这是一个很好的起点,并且已经证明很有帮助。
  • 刚吃过一个啊啊啊!时刻。我认为@Kirk Woll 正在尝试从创建的类型生成 C# 代码......他的意思是从原始方法中获取执行。呵呵!
【解决方案2】:

Randolpho 的链接应该为您指明正确的方向。至于发出相同的功能,您可以通过调用 X.GetMethodBody().GetILAsByteArray() 从方法中检索 IL,其中 X 是 MethodInfo 的给定实例。不过,这仍然需要在您的新方法中进行翻译和重新发送,因为据我所知,没有直接的方法可以将 byte[] 的 IL 流作为 IL 写入特定的 ILGenerator。

Haibo Luo 从 2005 年开始就有一个关于此的 blog post,它可能会为您指明正确的翻译方向(我还没有尝试过,因此无法验证它是否有效)。

【讨论】:

    【解决方案3】:

    您可以使用 MethodBodyReaderCCICecil 等工具复制依赖 System.Reflection.Emit 类型的类型结构 + 遍历和克隆方法体。但是,如果源类型中的方法正在使用一些内部字段或调用内部方法,或者可能使用外部类的属性(在内部类的情况下)......结果你会得到无效的代码。要更正它,您新创建的类型应放置在原始类型附近。幸运的是 Cecil 和 CCI 可以做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2021-03-05
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多