4

カスタム式クラスを作成することは可能ですか?もしそうなら、誰かが何か例がありますか?フレームワークの抽象式クラスから継承すると、そのコンストラクターがフレームワークの列挙型であるExpressionTypeパラメーターを受け取るという問題が発生します。これは明らかにカスタマイズできません。

何か案は?

4

4 に答える 4

2

.net 3.5 では、Expression コンストラクターが ExpressionType 列挙値を受け取り、新しいノード タイプを列挙型に追加できないため、これを行うことはできません。

「リーフ クラス」(BinaryExpression など) はすべてシールされているため、これらから継承することはできないため、既存のノード タイプをオーバーロードすることもできません。

MSDN ドキュメントによると、「Reduce」メソッドをオーバーライドし、ノード タイプ ExpressionType.Extension を使用する限り、CLR v4 でこれを実行できるようです。

于 2009-07-01T01:16:22.550 に答える
1

これはまさに、codeplex の DLR コードが実行しなければならなかったことです。最終的に、4.0 が出荷されるまで、別の名前空間(IIRC) でコードベース全体を再作成しました。

これは必ずしも C# コンパイラでうまくいくとは限りません。私は正直言って試していません。

于 2009-06-11T14:43:46.407 に答える
0

私もこれを試したことはありませんが、4.0で機能するはずだというスコットの声明に同意します。

具体的には、CodePlexの式ツリー仕様はNodeTypeプロパティについて次のように述べています。

.NETのノードの共通セットにない式の派生は、ノードの種類の拡張を返す必要があります

于 2010-06-03T16:32:53.580 に答える
0

Expression を拡張できるとは思いませんが、いくつかの拡張メソッドを追加して式ツリーを作成し、生成を簡素化できると思います。

たとえば、常に 2 つの文字列を比較したい場合は、ツリーを返す拡張メソッドを追加して比較を行うことができます。コードの他の場所に関数を呼び出す式を追加することもできるので、絶対にそのように開発する必要があるものに対してのみ式ツリーを作成できます。

于 2009-06-11T14:40:44.120 に答える