1

呼び出しチェーンを動的に作成して呼び出すことが可能かどうか誰かが知っていますか?

AとBの2つのクラスがあるとしましょう:

public class A
    public function Func() as B
        return new B()
    end function
end class

public class B
   public function Name() as string
      return "a string";
   end function
end class

Func()Name( )の両方のMethodInfoを取得し、それらを動的に呼び出して、A.Func().Name()と同様の呼び出しを取得できるようにしたいと考えています。

Delegate.CreateDelegate を使用して、2 つのMethodInfoオブジェクトから呼び出すことができるデリゲートを作成できることはわかっていますが、この方法では、呼び出しチェーンの一部としてではなく、2 つの関数を個別に呼び出すことしかできません。

式ツリーを使用する .NET 3.5 用の 2 つのソリューションと、可能であれば .NET 2.0 と互換性のあるソリューションを希望します。

4

2 に答える 2

2

.NET 3.5 を使用していますか? その場合、これを表す式ツリーを構築するのは比較的簡単です。VSを開かずに関連するツリーを簡単に書くのに十分なexpression-tree-fuがありませんが、それがオプションであることを確認したら、メモ帳で作業するようになります(私のEeeから...したがって、VSが不足しています) )。

編集:わかりました、式ツリーとして、次のようなものが必要です(C#コードですが、翻訳できると確信しています):

// I assume you've already got fMethodInfo and nameMethodInfo.
Expression fCall = Expression.Call(null, fMethodInfo);
Expression nameCall = Expression.Call(fCall, nameMethodInfo);
Expression<Func<string>> lambda = Expression.Lambda<Func<string>>(nameCall, null);
Func<string> compiled = lambda.Compile();

これはテストされていませんが、うまくいくはずだと思います...

于 2008-12-08T17:04:05.597 に答える
0

最初の式の前に次の行を追加する必要はありません:

Expression ctorCall = Expression.Constructor(A)

fCall を作成するときに、その式を第 1 パラメーターとして渡します。

そうしないと、チェーンの開始点が失われ、コードの実行時に例外が発生します。

于 2008-12-09T09:21:47.433 に答える