2013-05-11 34 views
3

我正在製作一個愚蠢的AOT .net編譯器以獲得樂趣,並且遇到了問題。我只是將程序集加載到內存中(我正在用C#編寫它)和垃圾郵件反射左右獲取我需要的信息(例如方法體的CIL)。C#反射 - 獲取方法的全部參數列表(包括「this」的參數)

This page說:「我們需要對當前實例的引用(存儲在本地參數索引0中)[...]」。但是,當我撥打MethodInfo.GetParameters()時,不會返回此參數。

我解決操作碼,如Ldarg到的ParameterInfo對象,而不是原始指標的領域,所以它會非常迷茫的時候「Ldarg.0」是一個實例方法中的 - 因爲ARG 0不GetParameters

我的主要問題:是否有某種方式可以獲得this對象(參數索引0)的ParameterInfo對象的實例,還是我必須使用原始索引? (我真的不想使用int索引...)

這是一些代碼,因爲代碼很好。 (包含在課程裏面)

static void Main(string[] args) 
{ 
    // obviously throws an IndexOutOfRangeException instead of returning the (true) argument 0 
    Console.WriteLine(typeof (Program).GetMethod("Test").GetParameters()[0]); 
} 

public void Test() 
{ 
} 

回答

3

你沒有得到一個ParameterInfo。簡單地說:如果它是一個實例方法,則有一個「this」映射到方法聲明類型的arg-0。除了類型之外,它沒有名字也沒有其他有趣的屬性。所有其他參數都偏移1。對於靜態方法,情況並非如此。請注意,對於值類型的實例方法,這是一個by-ref參數,這會變得更加有趣。

+0

所以我想我將不得不使用原始詮釋指數,只是有一個「如果實例和arg0然後加載'這個'」?我很害怕,但我想這不是太可怕。 – khyperia 2013-05-11 16:36:53

+0

@khyperia我只是使用實用方法,根據是否存在偏移量採取不同的行爲。你可以用null來表示「this」。 – 2013-05-11 16:42:45

+0

感謝您的想法,使用null沒有發生在我身上。 – khyperia 2013-05-11 17:04:11