Дефис в имени метода, это возможно на любом языке .NET? - PullRequest
2 голосов
/ 14 января 2010

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 14 января 2010

Вы можете сделать это, используя отражение.

Я собрал следующее в сборку, используя 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

Я сомневаюсь, что это возможно в обычных языках .NET. Я не знаю ни одного языка, который бы позволял / требовал, чтобы вы «избегали» идентификаторы. Без этого, не могли бы вы представить себе попытку устранения неоднозначности следующего:

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

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

1 голос
/ 14 января 2010

Дефисы в именах идентификаторов довольно распространены в Лиспе и Схеме, и, таким образом, я подозреваю, что они изначально поддерживаются в IronScheme , по крайней мере. Также довольно легко создавать такие методы в Ruby, , несмотря на тот факт, что hypens фактически недопустимы в идентификаторах Ruby, поэтому вы можете использовать IronRuby .

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

0 голосов
/ 14 января 2010

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

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

0 голосов
/ 14 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...