我正在努力创建一个通用的包装类,它将使用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',但未定义。
有办法做到这一点吗?
答案 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));