Дефис в имени метода, возможно ли это на любом языке .NET?

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

  •  20-09-2019
  •  | 
  •  

Вопрос

Мне нужно поддерживать метод с именем 'send-request' в качестве функции расширения, которая будет использоваться в преобразовании XSLT.Это обеспечивается объектом расширения на XslCompiledTransform.Классная вещь в extension objects vs. <msxsl:script> это, ну, то, что мне не нужно использовать <msxsl:script>, вы просто объявляете пространство имен и вызываете функцию.Плохо то, что имя функции должно точно совпадать с именем метода CIL.

Итак, мне интересно, существует ли язык .NET, который поддерживает дефисы в именах методов?Соответствие CLS не требуется, метод вызывается с использованием отражения.

Или я могу использовать какой-нибудь метод, который изменяет IL сборки, чтобы изменить имя метода?

Или, есть ли способ перехватить отражение GetMethod вызвать и обмануть вызывающего, что метод 'send-request' существует, но вместо этого возвращает метод 'sendRequest' ?

Это было полезно?

Решение

Вы можете сделать это с помощью отражения.

Я скомпилировал следующее в сборку, используя ILAsm (я вырезал весь пух, необходимый для того, чтобы это действительно скомпилировалось;это всего лишь основные моменты (каламбур)):

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

Я определил этот метод в классе с именем Program в пространстве имен с именем Test.Обратите внимание, что имя метода заключено в одинарные кавычки.Это соответствует спецификации (ECMA # 335).:

Идентификаторы используются для присвоения имен сущностям.Простые идентификаторы эквивалентны идентификатору.Однако синтаксис ILAsm позволяет использовать любой идентификатор, который может быть сформирован с использованием набора символов Unicode (см. Раздел I). Для достижения этого идентификатор должен быть заключен в одинарные кавычки.

Затем:

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

Это дало результат:

17

Я сомневаюсь, что это возможно в обычных .СЕТЕВЫЕ языки.Я не знаю ни одного языка, который позволял бы / требовал от вас "экранировать" идентификаторы.Без этого, могли бы вы представить себе попытку устранить неоднозначность в следующем:

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

Может, есть COBOL.NET где вы могли бы это сделать, я не знаю.

Другие советы

Дефисы в именах идентификаторов довольно распространены в Lisp и Scheme, и поэтому я подозреваю, что они изначально поддерживаются в Железная схема, по меньшей мере.В Ruby также довольно легко создавать подобные методы: несмотря на тот факт, что дефисы на самом деле незаконны в идентификаторах Ruby, поэтому вы можете использовать ЖелезоРубин.

Кроме того, есть @ escape-thingy в C#, который позволяет использовать незаконные идентификаторы, но я не мог понять, как его использовать в этом случае.

Я думаю, что самое простое, что вы могли бы здесь сделать, — это определить метод непосредственно в IL.Сначала определите абстрактный класс, который имеет все остальные методы, которые вам нужны.Затем определите производный класс в IL, который содержит имя метода через дефис, и скомпилируйте его в отдельную библиотеку.

Я вполне уверен, что часть спецификации языков CLR заключается в том, что они должны иметь возможность обрабатывать любое имя, поддерживаемое средой выполнения, даже если оно является зарезервированным ключевым словом на этом языке или является незаконным по иным причинам.

Предположим, что это так, если среда выполнения поддерживает дефисы в именах методов, тогда все языки CLR должны иметь возможность их обрабатывать, даже если для этого требуется что-то вроде, например.VB.NET [] синтаксис для их объявления или использования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top