创建一个通用的包装类,它将使用lambda表达式调用方法

时间:2013-07-06 00:20:08

标签: c# generics lambda expression-trees

我正在努力创建一个通用的包装类,它将使用lambda表达式调用方法。

代码如下所示:

包装类:

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);

我想我必须为方法表达式提供对象的实例“ instance ”,但我不知道如何...

当我运行此代码时,我得到了这个例外:

  

从范围''引用的'AsynCtry.Person'类型的变量'x',但未定义。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分: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));