连字符的方法名称,是否有可能在任何.NET语言?
-
20-09-2019 - |
题
我需要支持一个名为在XSLT转换中使用“发送请求”作为扩展功能的方法。这是通过在XslCompiledTransform
扩展对象提供。关于延长很酷的事情对象与<msxsl:script>
是,好,那我就不必使用<msxsl:script>
,你只需要声明的命名空间,并调用该函数。坏事是,函数名称必须与CIL方法名称相匹配。
所以,我想知道,有没有支持方法名连字符.NET语言? CLS遵从性不是必需的,该方法是使用反射调用。
或者,可予使用一些技术,修改一个组件的IL改变方法名?
或者,有一种方法来拦截反射GetMethod
呼叫及特技的是,方法“发送请求”存在于呼叫者,但返回一个“sendRequest将”方法,而不是
解决方案
可以做到这一点使用反射。
我编译以下到使用ILASM的组件(I切出一切必要的绒毛,使这个实际编译;这些只是凸位(双关语意)):
.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):
标识符被用于命名实体。简单标识符等价于一个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));
此产生的输出:
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在那里你可以做到这一点,我不知道。
其他提示
连字符在标识符名称是在Lisp和Scheme很常见的,因此我怀疑它在 IronScheme 本地支持一>,至少。它也很容易在Ruby中创建这样的方法,尽管的事实,hypens实际上是Ruby的标识符是非法的,所以你可以使用的 IronRuby的。
此外,还有在C#中@
逃生啄,允许您使用其他非法标识,但我不能完全弄清楚如何使用它的这种情况下。
我想你可以在这里做最简单的事情是直接在IL定义方法。首先定义其中有你想要所有其他方法的抽象类。然后定义在IL派生类含有hyphen'd方法名称和其编译成一个单独的库。
我有理由相信,该规范的CLR语言的部分是,他们必须能够处理任何名称的运行环境支持,即使它正好是在语言或其他非法保留关键字。
假如是这样的话,如果运行时支持方法名连字符,那么所有CLR语言应该能够处理它们,即使它需要像例如VB.NET的[]
语法来声明或使用它们。