2

私はC#、ハイブリッド言語として、smalltalk のようにオブジェクトではない演算子があることを知っています。

それらをオブジェクトとして扱う方法はありますか (のようにSmalltalk)? つまり、それらに属性とメソッドを追加するか、それらをクラス階層に含めます。

私の知る限り、(Google のおかげで) operator をオーバーロードすることは可能ですが、他に何も見つかりません。

たとえば、次のようなことが可能かどうかを知りたい

if(+.PrecedenceLevel > *.PrecedenceLevel) 
{
//something
}

私の仕事のためではなく、単なる好奇心の問題です。

4

2 に答える 2

3

オーバーロードされたオペレーターは静的メソッドであるため、MethodInfo操作または呼び出し可能な対応するオブジェクトがあります。

var eqStr = typeof(string).GetMethod("op_Equality");
Console.WriteLine(eqStr.Name);//op_Equality - the .NET name rather than the C# name
Console.WriteLine(eqStr.IsSpecialName);//True - languages may give it a different name
Console.WriteLine(eqStr.Invoke(null, new object[]{"abc", "abc"}));//True
Console.WriteLine(eqStr.Invoke(null, new object[]{"abc", "def"}));//False

これは実際にはメソッドの言語に中立な機能に到達することしかできませんが、これは役立つ可能性がありますが、特定の言語がどの名前を使用するか ( ==C#、=VB.NET など) などはわかりません。その優先順位またはいわば「操作可能な」もの。

また、組み込みではなく、オーバーロード専用です。

于 2012-09-03T16:41:04.367 に答える
2

簡単な答えは「いいえ」です。演算子は C# のオブジェクトではありません。また、静的メソッドを介した演算子のオーバーロード メカニズムでさえ、弱い設計のように思われるため、C# 演算子のオーバーロードのセクシーな例はめったに見られません。

しかし、好奇心旺盛な方のために説明すると、Jon が既に言及したリフレクションに加えて、.NET にはさらにいくつかのメタプログラミング メカニズムがあり、演算子はオブジェクトで表されます。それらに追加の属性を与えたり、優先順位を確認したりすることはまだできませんが、それはおそらく.NETで説明したものに最も近いものです。

1 つの方法は、Code DOM を操作することですCodeBinaryOperationExpression。クラスがあります。読み取りまたは作成するときは、CodeBinaryOperatorType列挙型を使用して演算子を指定します。たとえば、実行時に動的に選択された演算子を使用して式ツリーを作成し、それをラムダにコンパイルして、呼び出し元に戻して共通関数として使用するメソッドを C# で作成できます。

ある意味で前の方法とは反対に、コード解析機能を提供する新しいRoslyn APIを使用する方法もあります。ソース コードを Roslyn に渡すと、それが式ツリーに変換され、ビジターまたは構文リライターを記述してそのツリーを変更できます。たとえば、ツリーを調べて、すべての「プラス」演算子を「マイナス」演算子 (または任意のコード) に置き換えることができます。

詳細と例については、こちらこちらをご覧ください。

HTH。

于 2012-09-04T04:00:26.703 に答える