Pergunta

Eu preciso de apoio de um método chamado de "enviar solicitação" como uma função de extensão para ser usado em uma transformação XSLT.Este dado é fornecido por um objecto de extensão em XslCompiledTransform.A coisa legal sobre a extensão de objetos vs. <msxsl:script> é, bem, que eu não tenho para usar <msxsl:script>, você acabou de declarar o namespace e chamar a função.A única coisa ruim é que o nome da função deve coincidir exatamente o CIL nome do método.

Então, eu estou querendo saber, é que existe um .NET idioma que suporta hifens em nomes de método ?CLS cumprimento não é necessário, o método é invocado usando reflexão.

Ou, posso usar alguma técnica que modifica o IL de uma assembleia para alterar o nome do método ?

Ou, existe uma maneira de interceptar a reflexão GetMethod chamada e enganar o chamador que um método "enviar solicitação" existir, mas o retorno de um 'SendRequest' método de vez ?

Foi útil?

Solução

Você pode fazer isso usando reflexão.

Eu compilado em um assembly usando ILAsm (eu cortei todas as perfumarias necessário para fazer isso, na verdade, compilação;estes são apenas os mais salientes bits (trocadilho intencional)):

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

Eu definidos esse método em uma classe chamada Program em um namespace chamado Test.Observe que o nome do método é cercado por aspas simples.Isso é de acordo com a especificação ECMA (#335):

Identificadores são usados para nomear entidades.Simples identificadores são equivalentes a uma IDENTIFICAÇÃO.No entanto, a sintaxe ILAsm permite o uso de qualquer identificador que pode ser formada usando o conjunto de caracteres Unicode (veja Partição I). Para atingir este, um identificador deve ser colocado entre aspas simples.

Então:

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

Este produzido de saída:

17

Duvido que seja possível em que a habitual .A NET languages.Eu não sei de qualquer um dos idiomas permitir/exigir a "fuga" identificadores.Sem isso, poderia você imaginar, tentando distinguir o seguinte:

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

Talvez haja uma COBOL.NET onde você poderia fazer isso, eu não sei.

Outras dicas

Os hífens em nomes de identificadores são bastante comuns em lisp e esquema, e assim eu suspeito que seja apoiado nativamente em Ironscheme, pelo menos. Também é muito fácil criar métodos como este em Ruby, apesar de O fato de que os higiene são realmente ilegais nos identificadores de rubi, para que você possa usar IronRuby.

Além disso, há o @ Escape-Thingy em C# que permite que você use identificadores ilegais, mas não consegui descobrir como usá-lo para este caso.

Eu acho que a coisa mais simples que você poderia fazer aqui é definir o método diretamente no IL. Primeiro defina uma classe abstrata que tenha todos os outros métodos que você deseja. Em seguida, defina uma classe derivada no IL que contém o nome do método do hífen e compile em uma biblioteca separada.

Tenho razoavelmente certeza de que parte das especificações para os idiomas CLR é que eles devem ser capazes de lidar com qualquer nome que o tempo de execução suporta, mesmo que seja uma palavra -chave reservada nesse idioma ou ilegal.

Supondo que seja esse o caso, se o tempo de execução suportar hífens nos nomes de métodos, todos os idiomas CLR devem ser capazes de lidar com eles, mesmo que requer algo como por exemplo, vb.net's [] Sintaxe para declará -los ou usá -los.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top