メソッド名にハイフン、それは任意の.NET言語で可能ですか?
-
20-09-2019 - |
質問
私は、XSLT変換で使用する拡張機能として「要求を送信する」という名前のメソッドをサポートする必要があります。これはXslCompiledTransform
上の拡張オブジェクトによって提供されます。 <msxsl:script>
対拡張オブジェクトについての涼しい事は、私が<msxsl:script>
を使用する必要はありません、あなただけの名前空間を宣言し、関数を呼び出すことを、よく、です。悪いことは、関数名が正確にCILメソッド名と一致しなければならないということです。
だから、私は思ったんだけど、メソッド名にハイフンをサポート.NET言語はありますか? CLS準拠を必要としない、方法は、リフレクションを使用して呼び出されます。
それとも、私は、メソッド名を変更するには、アセンブリのILを変更するいくつかの手法を使用することができますか?
あるいは、反射GetMethod
呼び出しをインターセプトし、メソッドが存在する「要求を送信する」、代わりに「のsendRequest」メソッドを返す?
解決
あなたは、この使用して反射を行うことができます。
Iコンパイル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 でサポートされている疑いがありますA>、少なくとも。それはRubyでこのようなメソッドを作成することも非常に簡単です、ののにもかかわらず、使用することができるようにハイフンが、実際にRubyの識別子では違法であるという事実<のhref =「http://IronRuby.Net/」のrel = "nofollowをnoreferrer"> IronRubyのでます。
また、あなたがそうでなければ違法な識別子を使用することができますC#で@
エスケープ・ブツがありますが、私はかなりこのような場合のためにそれを使用する方法を見つけ出すことができませんでした。
私はあなたがここに何ができる最も簡単な方法は、ILに直接メソッドを定義していると思います。まず、あなたがしたい他のすべてのメソッドを持つ抽象クラスを定義します。そして、hyphen'dメソッド名を含むILでの派生クラスを定義して、別のライブラリにコンパイルします。
私は、CLR言語の仕様の一部は、彼らは予約され、その言語のキーワードあるいは違法であることを起こる場合でも、ランタイムがサポートしている任意の名前を処理できなければならないということであることを合理的に確信しています。
それは例えばのようなものを必要とする場合であっても、ランタイムはメソッド名にハイフンをサポートしている場合、すべてのCLR言語がそれらを処理することができる必要があり、それが事実だと仮定すると、それらを宣言するか、使用するVB.NETの[]
構文ます。