2012-02-24 44 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

相關問題