2009-07-01 25 views
2

例如,在C#中使用out關鍵字的方法中的參數將顯示在元數據簽名中,其前面帶有與符號&。我試圖創建一個通用方法的簽名,但我不想使用元數據API來解決這個問題,當然這是記錄在某個地方?.NET 2.0/C#中泛型方法元數據的簽名格式是什麼?

這裏是我的意思了BeginReceiveFrom在Socket類的例子:

 System.IAsyncResult([]System.Byte,System.Int32,System.Int32, 
    System.Net.Sockets.SocketFlags,&System.Net.EndPoint, 
System.AsyncCallback,System.Object) 

回答

4

有一個反引號後面的參數的個數,對於未構造類型,例如

List`1 
Dictionary`2 

從ECMA 335中,部分10.7.2:

10.7.2類型名稱和元數編碼

符合CLS一般類型名稱是使用格式 名稱 編碼[」 arity],其中[012]表示 表示重音字符"'" 和arity在一起是可選的。該 編碼的名稱應遵循下列規則:

  1. 名稱必須是一個ID(請參閱分區II)不包含在「`」 字符。
  2. arity被指定爲無符號十進制數,前導零或空格 。
  3. 對於正常的泛型類型,arity是類型上聲明爲 的類型參數的數量。
  4. 對於嵌套泛型類型,arity是新引入的類型 參數的數量。

(請注意,我不能讓反引號中引號的工作,由於降價 - 因此撇號!)

不知道有關的構造類型...

1

要聲明您使用!!T引用泛型參數的一般方法:

.method public static void Method<T1, T2>(!!T1 arg1, !!T2 arg2) { 
    // ... 
} 

,或者您可以使用自己的號:

.method public static void Method<T1, T2>(!!0 arg1, !!1 arg2) 

並調用您提供實例化的泛型方法。然而,該類型的實例提到的WRT的的調用的方法,不是你是從調用它:

ldc.i4.1 
newobj instance void [mscorlib]System.Object::.ctor() 

// !!0 and !!1 refer to the generic parameters of Method<T1, T2>, 
// not any generic method this call instruction is part of 
call void Method<int32, object>(!!0,!!1) 

如果該方法是一個通用型的一部分,您使用指定類型實例!T以類似的方式參考類型參數。請注意,通用類型在類型名稱後面有一個`,之後是通用參數的數目:

call instance void MyGenericType`1<int32>::Method(!0) 
相關問題