Trait d'union dans le nom de la méthode, il est possible dans toutes les langues de .NET?

StackOverflow https://stackoverflow.com/questions/2061811

  •  20-09-2019
  •  | 
  •  

Question

Je dois soutenir une méthode appelée « demande d'envoi » comme une fonction d'extension à utiliser dans une transformation XSLT. Ceci est fourni par un objet d'extension sur XslCompiledTransform. La chose fraîche au sujet des objets d'extension par rapport à <msxsl:script> est, bien, que je ne dois pas utiliser <msxsl:script>, vous déclarez que l'espace de noms et appeler la fonction. La mauvaise chose est que le nom de la fonction doit correspondre exactement au nom de la méthode CIL.

Alors, je me demande, est-il un langage .NET qui prend en charge les noms de traits d'union dans la méthode? conformité CLS n'est pas nécessaire, la méthode est appelée par réflexion.

Ou, puis-je utiliser une technique qui modifie l'IL d'un ensemble pour changer le nom de la méthode?

Ou, est-il un moyen d'intercepter l'appel de réflexion GetMethod et piègent l'appelant qu'une méthode « demande d'envoi » existe, mais le retour d'une méthode « SendRequest » au lieu?

Était-ce utile?

La solution

Vous pouvez le faire en utilisant la réflexion.

Je compilé ce qui suit dans un ensemble à l'aide ILAsm (je coupe toutes les peluches nécessaires pour faire de cette compilation en fait, ce ne sont que les bits saillants (jeu de mots)):

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

Je défini cette méthode dans une classe nommée Program dans un espace de noms nommé Test. Notez que le nom de la méthode est entouré par des guillemets simples. Ceci est par la spécification ECMA (# 335):

  

Identifiants sont utilisés pour nommer des entités. identifiants simples sont équivalents à un ID. Cependant, la syntaxe ILAsm   permet l'utilisation d'un identificateur qui peut être formé en utilisant le jeu de caractères Unicode (voir partition I). Pour   cela, un identifiant doit être placé entre guillemets simples.

Alors:

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

Cette sortie produit:

17

Je doute que ce soit possible dans les langages .NET habituels. Je ne connais pas toutes les langues qui permettent / nécessitent d'identificateurs « échapper ». Sans cela, pourriez-vous imaginer essayer de lever l'ambiguïté qui suit:

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

Peut-être il y a un COBOL.NET où vous pouvez faire cela, je ne sais pas.

Autres conseils

Les traits d'union dans les noms d'identification sont assez communs dans Lisp et Scheme, et donc je suppose qu'il est nativement prise en charge dans ironscheme , au moins. Il est également assez facile de créer des méthodes comme celle-ci dans Ruby, malgré le fait que hypens sont en fait illégaux dans les identificateurs Ruby, de sorte que vous pouvez utiliser IronRuby .

En outre, il y a l'évasion @-thingy en C # qui vous permet d'utiliser autrement des identificateurs illégaux, mais je ne pouvais pas tout à fait comprendre comment l'utiliser pour ce cas.

Je pense que la chose la plus simple que vous pourriez faire ici est de définir la méthode directement dans IL. Tout d'abord définir une classe abstraite qui a tout autre méthode que vous voulez. Ensuite, définir une classe dérivée en IL qui contient le nom de la méthode hyphen'd et compiler dans une bibliothèque séparée.

Je suis raisonnablement sûr qu'une partie de la spécification pour les langues CLR est qu'ils doivent être en mesure de gérer un nom que le prend en charge l'exécution, même si elle se trouve être un mot-clé réservé dans cette langue ou autrement illégale.

En supposant que ce soit le cas, si l'exécution prend en charge les traits d'union dans les noms de méthodes, toutes les langues CLR doivent être en mesure de les manipuler, même si elle exige quelque chose comme par exemple La syntaxe de [] de VB.NET de déclarer ou de les utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top