2009-07-01 8 views
2

Zum Beispiel werden Parameter in einer Methode, die das Schlüsselwort out in C# verwenden, in der Metadatensignatur angezeigt, der ein Und-Zeichen & vorausgeht. Ich versuche, die Signatur für eine generische Methode zu erstellen, aber ich möchte nicht die Metadaten-APIs verwenden, um das herauszufinden, sicherlich ist es irgendwo dokumentiert?Wie lautet das Signaturformat für Metadaten zu generischen Methoden in .NET 2.0/C#?

Hier ist ein Beispiel dafür, was ich für BeginReceiveFrom auf der Socket-Klasse bedeuten:

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

Antwort

4

ein Graviszeichen durch die Anzahl der Argumente für den unkonstruierten Typen gefolgt Es gibt, zum Beispiel

List`1 
Dictionary`2 

Von ECMA 335, Abschnitt 10.7.2:

10.7.2 Typnamen und arity Codierung

CLS-kompatibel generic Typnamen sind codiert das Format Namen [‘ Arity], wobei [...] angibt, dass der Akzentzeichen "'" und arity zusammen optional sind. Der codierten Namen werden diese Regeln befolgen:

  1. Name soll eine ID (siehe Partition II), die nicht die „`“enthält Charakter.
  2. Arity wird als vorzeichenlose Dezimalzahl ohne führende Nullen oder Leerzeichen angegeben.
  3. Für einen normalen generischen Typ ist Arity die Anzahl der Typ-Parameter, die für den Typ deklariert sind.
  4. Für einen verschachtelten generischen Typ ist Arity die Anzahl der neu eingeführten Typ Parameter.

(Beachten Sie, dass ich nicht die Graviszeichen in Anführungszeichen arbeiten konnte, aufgrund Abschlags - daher die Apostrophe!)

Nicht sicher Typen über konstruiert ...

1

To deklarieren Sie eine generische Methode, die Sie !!T verwenden, um die generischen Parameter zu verweisen:

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

oder Sie ihre Nummer verwenden können:

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

und um eine generische Methode aufzurufen, geben Sie die Instanziierung an. Allerdings bezeichnet die Typen, die in der Instanziierung sind wrt die die Methode namens, nicht wo Sie anrufen aus:

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) 

Wenn das Verfahren Teil eines allgemeinen Typ ist, der Typ Instanziierung angeben Verwendung !T, um in ähnlicher Weise auf die Typparameter zu verweisen. Beachten Sie, dass es eine Konvention ist, dass generische Typen nach dem Typnamen gefolgt von der Anzahl der generischen Argumente folgendes haben:

call instance void MyGenericType`1<int32>::Method(!0)