0

Expression.Dynamic() を使用して代入操作を構築しようとしています...これを使用して、言語の特定のカスタム型インスタンスに値型セマンティクスを選択的に提供したいと考えています。実際の型がわからないため、「静的」(?) 式でこれを行うことはできません (MetaObject インスタンスとその LimitType が必要です... したがって、 Expression.Dynamic() )。

これは私にとってはうまくいきません... Expression.Assign() を使用して OperationBinder サブクラスから MetaObject を構築した場合、何もしません。

頭。ドキドキ。の上。デスク。為に。時間。

これがサポートされている動作なのか、それとも間違ったツリーを鳴らしているのか疑問に思っていますか?

ありがとう...

4

3 に答える 3

3

基本的に2つのオプションがあると思います。いずれにしても、OperationBinder のサブクラスではなく、カスタム バインダーを使用する必要があります。これは、クロス言語操作を実行していないためです。代わりに、言語セマンティクスの一部を実装していますが、優れた DLR が必要なだけです。これを実現するには、MetaObjectBinder をサブクラス化する必要があります (古いビルドでは MetaAction)。

したがって、ローカルに割り当てた新しい値を返す Ast.Dynamic を使用するか、値を ref 引数として渡すかの 2 つの選択肢があります。これらは次のようになります。

Ast.Assign(localVal, Ast.Dynamic(new AssignBinder(...), localVal, newVal);

or

delegate void AssignDelegate<TLocal, TValue>(CallSite site, TLocal loc, TValue val);
Type dlgType = typeof(AssignDelegate).MakeGenericType(new Type[] { localVal.Type, newVal.Type });
Ast.Dynamic(dlgType, new AssignBinder(...), localVal, newVal);

バインダーで、着信メタオブジェクトを提供する Bind メソッドをオーバーライドします。1 つ目は新しい値を返すだけで、2 つ目は最初の MetaObject に割り当てるだけです。

私はこれを試していませんが、基本的にはこのように動作するはずです。

于 2009-01-07T03:53:38.657 に答える
0

正確なシナリオを明確にできますか? 私は に非常に精通しExpressionており、DLR ツリー / 4.0 でそれを使用することにもまずまず慣れていますが、あなたが何をしようとしているのか 100% 確信が持てません。また、このタイプの使用法にはいくつかの制限があることにも注意してください(C# であるか生のツリーであるかに関係なく)。

于 2009-01-06T07:54:55.160 に答える