Вы можете сделать это, используя отражение.
Я собрал следующее в сборку, используя 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, где вы могли бы сделать это, я не знаю.