【问题标题】:create a generic wrapper class which will call the methods with lambda expressions创建一个通用包装类,它将使用 lambda 表达式调用方法
【发布时间】:2013-07-06 00:20:08
【问题描述】:

我正在努力创建一个通用包装类,它将使用 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”,但未定义。

有没有办法做到这一点?

【问题讨论】:

    标签: c# generics lambda expression-trees


    【解决方案1】:

    您不需要表达式 - 只需直接使用委托:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      相关资源
      最近更新 更多