Какъв е форматът на подписа за метаданни за общи методи в .NET 2.0/C#?

Например, параметри в метод, който използва ключовата дума out в C#, ще се показват в подписа на метаданните, предшестван от амперсанд &. Опитвам се да създам подписа за общ метод, но не искам да използвам API за метаданни, за да разбера това, сигурно е документирано някъде?

Ето пример за това, което имам предвид за BeginReceiveFrom в класа Socket:

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

person Leeks and Leaks    schedule 01.07.2009    source източник


Отговори (2)


Има обратна отметка, последвана от броя на аргументите, за неконструирания тип, напр.

List`1
Dictionary`2

От ECMA 335, раздел 10.7.2:

10.7.2 Имена на типа и кодиране на аритет

Имената на общия тип, съвместими с CLS, се кодират с помощта на формата “име[`arity]”, където […] показва, че знакът за сериозен ударение “`” и arity заедно са по желание. Кодираното име следва следните правила:

  1. име трябва да бъде ID (вижте Раздел II), който не съдържа знака „`“.
  2. arity се определя като десетично число без знак без водещи нули или интервали.
  3. За нормален общ тип, arity е броят параметри на типа, декларирани в типа.
  4. За вложен общ тип, arity е броят на нововъведените параметри на типа.

Не съм сигурен за конструираните типове...

person Jon Skeet    schedule 01.07.2009

За да декларирате общ метод, вие използвате !!T за препратка към общите параметри:

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

или можете да използвате техния номер:

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

и за да извикате общ метод, вие предоставяте екземпляра. Обаче типовете, посочени в инстанцията, са спрямо извикания метод, а не откъде го извиквате:

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)
person thecoop    schedule 21.02.2011