Frage

Ich muss eine Methode namens "Send-Request" als Erweiterungsfunktion unterstützen, die in einer XSLT-Transformation verwendet werden soll. Dies wird durch ein Erweiterungsobjekt auf bereitgestellt XslCompiledTransform. Das Coole an Erweiterungsobjekten vs. <msxsl:script> ist na ja, dass ich nicht benutzen muss <msxsl:script>, Sie deklarieren einfach den Namespace und rufen die Funktion auf. Das Schlechte ist, dass der Funktionsname genau mit dem CIL -Methodennamen übereinstimmen muss.

Ich frage mich also, dass es eine .NET -Sprache gibt, die Bindestriche in Methodennamen unterstützt? CLS Compliance ist nicht erforderlich, die Methode wird unter Verwendung von Reflexion aufgerufen.

Oder kann ich eine Technik verwenden, die das IL einer Baugruppe ändert, um den Methodennamen zu ändern?

Oder gibt es eine Möglichkeit, die Reflexion abzufangen GetMethod Rufen Sie den Anrufer an, dass eine Methode "Send-Request" existiert, aber stattdessen eine "SendRequest" -Methode zurückgeben?

War es hilfreich?

Lösung

Sie können dies mit Reflexion tun.

Ich habe Folgendes in eine Baugruppe mit Ilasm zusammengestellt (ich schnitt den gesamten Flusen aus, um dies tatsächlich kompilieren zu lassen; dies sind nur die herausragenden Bits (Wortspiel beabsichtigt)):

.method private hidebysig static int32 
'Te-st'() cil managed {
    // Code size       8 (0x8)
    .maxstack  1
    .locals init ([0] int32 CS$1$0000)
    IL_0000:  nop
    IL_0001:  ldc.i4.s 0x11
    IL_0002:  stloc.0
    IL_0003:  br.s       IL_0005

    IL_0005:  ldloc.0
    IL_0006:  ret
}

Ich habe diese Methode in einer Klasse namens definiert Program in einem Namespace namens namens Test. Beachten Sie, dass der Methodenname von einzelnen Zitaten umgeben ist. Dies ist die Spezifikation (ECMA #335):

Kennungen werden verwendet, um Entitäten zu benennen. Einfache Kennungen entsprechen einer ID. Die Ilasm -Syntax ermöglicht jedoch die Verwendung eines beliebigen Kennung, der mit dem Unicode -Zeichensatz gebildet werden kann (siehe Partition I). Um dies zu erreichen, muss ein Kennung innerhalb der einzelnen Anführungszeichen platziert werden.

Dann:

var assembly = Assembly.LoadFrom(path);
var method = assembly.GetType("Test.Program")
                     .GetMethod(
                         "Te-st",
                         BindingFlags.Static | BindingFlags.NonPublic
             );
Console.WriteLine(method.Invoke(null, null));

Dies erzeugte Ausgabe:

17

Ich bezweifle, dass dies in den üblichen .NET -Sprachen möglich ist. Ich kenne keine Sprachen, die es Ihnen erlauben/verlangen, dass Sie Identifikatoren "entkommen". Können Sie sich ohne das vorstellen, Folgendes zu disambiguieren:

int a;
int b;
int a-b;
int diff = a-b; // is that a minus b or the variable a-b?

Vielleicht gibt es ein COBOL.NET, in dem Sie das tun könnten, ich weiß es nicht.

Andere Tipps

Bindestriche in Identifikatornamen sind in Lisp und Schema ziemlich verbreitet, und daher vermute ich, dass es nativ unterstützt wird Ironschem, wenigstens. Es ist auch ziemlich einfach, solche Methoden wie diese in Ruby zu erstellen. Trotz Die Tatsache, dass Hypens in Ruby -Kennungen tatsächlich illegal sind, so können Sie verwenden Ironruby.

Außerdem gibt es das @ Escape-Thingy in C#, mit dem Sie ansonsten illegale Kennungen verwenden können, aber ich konnte nicht ganz herausfinden, wie ich es für diesen Fall verwenden soll.

Ich denke, das Einfachste, was Sie hier tun können, ist, die Methode direkt in IL zu definieren. Definieren Sie zunächst eine abstrakte Klasse, die über jede andere Methode verfügt, die Sie möchten. Definieren Sie dann eine abgeleitete Klasse in IL, die den Hyphen'd -Methodennamen enthält und sie in eine separate Bibliothek kompilieren.

Ich bin mir einigermaßen sicher, dass ein Teil der Spezifikation für CLR -Sprachen darin besteht, dass sie in der Lage sein müssen, jeden Namen zu verarbeiten, den die Laufzeit unterstützt, auch wenn es sich um ein reserviertes Keyword in dieser Sprache oder auf andere Weise illegal handelt.

Angenommen, dies ist der Fall, wenn die Laufzeit Bindestriche in Methodamen unterstützt, sollten alle CLR -Sprachen in der Lage sein, sie zu handhaben, auch wenn es so etwas wie z. B. VB.NETs erfordert [] Syntax, um sie zu deklarieren oder zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top