Pregunta

necesito para apoyar un método llamado 'enviar-petición' como una función de extensión para ser utilizado en una transformación XSLT. Este es proporcionado por un objeto de extensión en XslCompiledTransform. Lo bueno de objetos de extensión frente a <msxsl:script> es, así, que yo no tengo que usar <msxsl:script>, que acaba de declarar el espacio de nombres y llamar a la función. Lo malo es que el nombre de la función debe coincidir exactamente con el nombre del método CIL.

Por lo tanto, me pregunto, ¿hay un lenguaje .NET que es compatible con guiones en los nombres de métodos? No se requiere compatibilidad con CLS, el método se invoca mediante la reflexión.

O, puedo utilizar alguna técnica que modifica la IL de un conjunto para cambiar el nombre del método?

O, ¿hay una manera de interceptar la llamada reflexión GetMethod y engañar a la persona que llama que existe un método 'enviar-petición', pero devolver un método 'sendRequest' en su lugar?

¿Fue útil?

Solución

Usted puede hacer esto mediante la reflexión.

I compilado la siguiente en un conjunto utilizando ILASM (corté toda la pelusa necesario hacer esto en realidad compilar; estos son sólo los bits salientes (juego de palabras)):

.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
}

he definido este método en una llamada Program clase en un espacio de nombres llamado Test. Tenga en cuenta que el nombre del método está rodeado por comillas simples. Esto es por la especificación ECMA (# 335):

  

Los identificadores se utilizan para entidades de nombre. identificadores simples son equivalentes a un ID. Sin embargo, la sintaxis ILASM   permite el uso de cualquier identificador que se puede formar utilizando el conjunto de caracteres Unicode (ver Partición I). Para lograr   esto, un identificador se colocará dentro de comillas simples.

A continuación:

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

Esta salida producida:

17

No creo que es posible en los lenguajes .NET habituales. No sé de ningún idioma que permiten / requieren que se "escape" identificadores. Sin eso, ¿podría imaginar tratando de eliminar la ambigüedad de lo siguiente:

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

Tal vez hay un COBOL.NET donde se podía hacer esto, no lo sé.

Otros consejos

Los guiones en los nombres de identificadores son bastante comunes en Lisp y Scheme, y por lo tanto sospecho que es compatible de forma nativa en IronScheme , por lo menos. También es bastante fácil crear métodos como éste en Ruby, a pesar el hecho de que hypens en realidad son ilegales en los identificadores de Ruby, por lo que podría utilizar IronRuby .

Además, está el @ escape cosita en C # que permite el uso de identificadores de otro modo ilegales, pero no pude encontrar la manera de usarlo para este caso.

Creo que la cosa más simple que podría hacer aquí es definir el método directamente en IL. En primer lugar definir una clase abstracta que tiene cualquier otro método que desee. A continuación, defina una clase derivada en IL que contiene el hyphen'd nombre del método y compilarlo en una biblioteca separada.

Estoy razonablemente seguro de que parte de la especificación de lenguajes CLR es que deben ser capaces de manejar cualquier nombre que el tiempo de ejecución es compatible, incluso si resulta que es una palabra clave reservada en ese idioma o de otra manera ilegal.

Si se asume que es el caso, si el tiempo de ejecución es compatible con guiones en los nombres de métodos, a continuación, todos los lenguajes CLR deben ser capaces de manejar, incluso si requiere algo así como, por ejemplo, [] sintaxis de VB.NET para declarar o usarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top