C# 创建一个通用包装器类,该类将使用lambda表达式调用方法

C# 创建一个通用包装器类,该类将使用lambda表达式调用方法,c#,generics,lambda,expression-trees,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>> aExpre

我正在努力创建一个通用包装器类,它将使用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());
    }
}
我打电话的地方:

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x =>x.GetPersonById(2),Console.WriteLine);
var serviceWrapper=new服务(new Person());
serviceWrapper.Call(x=>x.GetPersonById(2),Console.WriteLine);
我想我必须将对象的实例“instance”匹配到方法表达式,但我不知道如何

运行此代码时,会出现以下异常:

从作用域“”引用了类型为“AsynCtry.Person”的变量“x”,但未定义该变量


有什么方法可以做到这一点吗?

这不需要表达式-直接使用委托即可:

public void Call<U>(Func<T, U> aExpression, Action<U> returnClass)
{
    U result = aExpression(this.instance);
    returnClass(result);
}
public void调用(Func-aExpression,Action-returnClass)
{
U result=aExpression(this.instance);
返回类(结果);
}
您的方法调用应该正常工作,然后:

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x => x.GetPersonById(2), u => Console.WriteLine(u));
var serviceWrapper=new服务(new Person());
调用(x=>x.GetPersonById(2),u=>Console.WriteLine(u));
var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x => x.GetPersonById(2), u => Console.WriteLine(u));