有没有一种直接的方法来使用反射复制类型?

时间:2010-09-24 17:28:11

标签: .net reflection dynamic types reflection.emit

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

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

3 个答案:

答案 0 :(得分:3)

我认为没有一种神奇的子弹方法可以帮助你,但可以使用Reflection Emit进行操作。

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

答案 1 :(得分:1)

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

Haibo Luo从2005年开始blog post就可以指出你正确的翻译方向(我没有尝试过,所以我无法验证它是否有效)。

答案 2 :(得分:0)

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