5

ラムダ式でメソッドを呼び出すジェネリック ラッパー クラスの作成に苦労しています。

コードは次のようになります。

ラッパー クラス:

public class Service<T>
{
    private T instance;

    public Service(T param)
    {
        this.instance = param;
    }

    public void Call<U>(Expression<Func<T, U>> aExpression, Action<U> returnClass)
    {
        var methodCallExpr = aExpression.Body as MethodCallExpression
        var lambdaToFunc = Expression.Lambda(methodCallExpr).Compile();
        returnClass((U)lambdaToFunc.DynamicInvoke());
    }
}

ラップされるクラス:

public class Person
{
    public int GetPersonById(int bbb)
    {
        return bbb;
    }
}

電話をかけた場所:

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x =>x.GetPersonById(2),Console.WriteLine);

「インスタンス」であるオブジェクトのインスタンスをメソッド式に添付する必要があると思いますが、方法がわかりません..

このコードを実行すると、次の例外が発生します。

タイプ 'AsynCtry.Person' の変数 'x' がスコープ '' から参照されていますが、定義されていません。

これを行う方法はありますか?

4

1 に答える 1

8

これには式は必要ありません。デリゲートを直接使用するだけです。

public void Call<U>(Func<T, U> aExpression, Action<U> returnClass)
{
    U result = aExpression(this.instance);
    returnClass(result);
}

メソッド呼び出しが機能するはずです。

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x => x.GetPersonById(2), u => Console.WriteLine(u));
于 2013-07-06T00:23:31.353 に答える