Hífen no nome do método, é possível em qualquer um .NET idioma?
-
20-09-2019 - |
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 ?
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.