方法名称中的连字符,是否可以在任何.NET语言中使用?

Max*_*oro 2 .net clr xslcompiledtransform

我需要支持名为'send-request'的方法作为在XSLT转换中使用的扩展函数.这是由扩展对象提供的XslCompiledTransform.关于扩展对象的酷炫之处<msxsl:script>是,我不必使用<msxsl:script>,只需声明命名空间并调用函数即可.不好的是,函数名称必须与CIL方法名称完全匹配.

所以,我想知道,是否有一种.NET语言支持方法名称中的连字符?不需要CLS合规性,使用反射调用该方法.

或者,我可以使用一些修改程序集IL的技术来更改方法名称吗?

或者,有没有办法拦截反射GetMethod调用并欺骗调用者方法'send-request'存在,但返回'SendRequest'方法呢?

jas*_*son 6

你可以使用反射来做到这一点.

我使用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
}
Run Code Online (Sandbox Code Playgroud)

我在名为命名Program空间的命名空间中定义了此方法Test.请注意,方法名称由单引号括起.这是根据规范(ECMA#335):

标识符用于命名实体.简单标识符等同于ID.但是,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));
Run Code Online (Sandbox Code Playgroud)

这产生了输出:

17
Run Code Online (Sandbox Code Playgroud)

我怀疑通常的.NET语言是否可行.我不知道任何允许/要求您"转义"标识符的语言.没有它,你能想象试图消除以下的歧义:

int a;
int b;
int a-b;
int diff = a-b; // is that a minus b or the variable a-b?
Run Code Online (Sandbox Code Playgroud)

也许有一个COBOL.NET你可以做到这一点,我不知道.