2012-02-24 53 views
4

我试图用Mono.Cecil能重现以下IL:如何在Mono.Cecil中为MethodReference创建GenericParameter返回类型?

call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [System]System.ComponentModel.PropertyChangedEventHandler>(!!0&, !!0, !!0) 

当我使用Mono.Cecil能检查这种IL,我看到指令的操作数是GenericInstanceMethod,其持有元方法类型的MethodReference。这个MethodReference又有一个GenericParameter类型的返回类型。

我想用手创建相同的对象,但是看起来达到了catch-22。要创建一个GenericParameter,我需要一个IGenericParameterOwner,它似乎与上面的MethodReference非常相似。所以我想将MethodReference传递给GenericParameter构造函数。然而,我不能创建没有类型引用的返回类型的MethodReference,我认为它应该是GenericParameter。

我该如何解决这个问题?我误解了什么?

回答

4

这似乎是一个API的问题,因为它是。

解决此问题的简单方法是将TypeReference作为MethodReference的ReturnType传递给void,然后将ReturnType更改为后面创建的GenericParameter。

+0

啊,所以你的意思是我可以做这样的事情? 'var elementMethodRef = new MethodReference(“CompareExchange”,_voidTypeRef); var genParam = new GenericParameter(“!! 0”,elementMethodRef); elementMethodRef.ReturnType = genParam;' – Einar 2012-02-25 20:07:20

+0

@Einar yes,然后elementMethodRef.GenericParameters.Add(genParam); – 2012-02-25 21:28:58

+0

太棒了,那是失踪的一块!谢谢! – Einar 2012-02-25 21:36:15

相关问题