カスタム式クラスを作成することは可能ですか?もしそうなら、誰かが何か例がありますか?フレームワークの抽象式クラスから継承すると、そのコンストラクターがフレームワークの列挙型であるExpressionTypeパラメーターを受け取るという問題が発生します。これは明らかにカスタマイズできません。
何か案は?
カスタム式クラスを作成することは可能ですか?もしそうなら、誰かが何か例がありますか?フレームワークの抽象式クラスから継承すると、そのコンストラクターがフレームワークの列挙型であるExpressionTypeパラメーターを受け取るという問題が発生します。これは明らかにカスタマイズできません。
何か案は?
.net 3.5 では、Expression コンストラクターが ExpressionType 列挙値を受け取り、新しいノード タイプを列挙型に追加できないため、これを行うことはできません。
「リーフ クラス」(BinaryExpression など) はすべてシールされているため、これらから継承することはできないため、既存のノード タイプをオーバーロードすることもできません。
MSDN ドキュメントによると、「Reduce」メソッドをオーバーライドし、ノード タイプ ExpressionType.Extension を使用する限り、CLR v4 でこれを実行できるようです。
これはまさに、codeplex の DLR コードが実行しなければならなかったことです。最終的に、4.0 が出荷されるまで、別の名前空間(IIRC) でコードベース全体を再作成しました。
これは必ずしも C# コンパイラでうまくいくとは限りません。私は正直言って試していません。
私もこれを試したことはありませんが、4.0で機能するはずだというスコットの声明に同意します。
具体的には、CodePlexの式ツリー仕様はNodeTypeプロパティについて次のように述べています。
.NETのノードの共通セットにない式の派生は、ノードの種類の拡張を返す必要があります
Expression を拡張できるとは思いませんが、いくつかの拡張メソッドを追加して式ツリーを作成し、生成を簡素化できると思います。
たとえば、常に 2 つの文字列を比較したい場合は、ツリーを返す拡張メソッドを追加して比較を行うことができます。コードの他の場所に関数を呼び出す式を追加することもできるので、絶対にそのように開発する必要があるものに対してのみ式ツリーを作成できます。