获取作为函数传递的Lambda中的参数的引用

霍尔夫

给定以下类集:

public class MyClass
{
    public int MyInt { get; set; }
}    

public class ObjectProcessor
{
    public int ProcessObject(MyClass myClass)
    {
        return myClass.MyInt ++;
    } 
}

public class Runner
{
    public void Run()
    {
        var classToPass = new MyClass();

        FuncExecutor.ExecuteAction<MyClass>(x => x.ProcessObject(classToPass));
    }
}

public static class FuncExecutor
{
    public static void ExecuteAction<T>(Expression<Func<ObjectProcessor, int>> expression)
    {
        // var func = expression.Compile(); ... does having an Expression help?

        // How can I get a reference to 'classToPass' at this point?

        // The 'classToPass' Type is known to be 'T', in this case 'MyClass'.
    }
}

ExecuteAction方法内部,如何获得对classToPass传入实例的引用ProcessObject

编辑:评论强调了试图解析表达式树的复杂性,表达式树的组成可能有很大差异。

但是,在这种特殊情况下,有两个事实大大减少了这种变化:

  • ProcessObject 只会采用一个参数。
  • 参数类型是预先已知的。

代码已更改以表达这一点。

罗曼·威尔第(Romain Verdier)

具体回答:

public class Runner
{
    public void Run()
    {
        var classToPass = new MyClass();
        classToPass.MyInt = 42;

        FuncExecutor.ExecuteAction(x => x.ProcessObject(classToPass));
    }
}

public class FuncExecutor
{
    public static void ExecuteAction(Expression<Func<ObjectProcessor, int>> expression)
    {
        var lambdaExpression = (LambdaExpression)expression;
        var methodCallExpression = (MethodCallExpression)lambdaExpression.Body;

        var memberExpression = (MemberExpression)methodCallExpression.Arguments[0];
        var constantExpression = (ConstantExpression)memberExpression.Expression;
        var fieldInfo = (FieldInfo)memberExpression.Member;

        var myClassReference = (MyClass) fieldInfo.GetValue(constantExpression.Value);

        Console.WriteLine(myClassReference.MyInt); // prints "42"
    }
}

请注意,将lambda传递给ExecuteAction方法时,将捕获局部变量引用(classToPass)。编译器将生成一些代码以正确处理该代码。更准确地说,它将生成一个具有单个类型成员(字段)的类型MyClass来保存引用,并从此开始使用它。这就是为什么您MemberExpression在参数表达式列表中得到一个的原因

由于您不能直接操作此生成的类型,因此不能仅使用成员表达式Value属性。但是您可以使用MemberInfo和目标引用(编译器生成的类型的实例)动态调用成员访问器。

我不会依赖此代码。

您可以在此处阅读有关lambda相关的编译器生成的代码的更多信息,例如:http : //thewalkingdev.blogspot.fr/2012/04/c-lambda-expressions-and-closures.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Lambda函数作为参数传递

来自分类Dev

作为参数传递时,在函数中更新指针地址。[将指针作为C中的引用传递]

来自分类Dev

将函数引用作为参数传递

来自分类Dev

将函数作为参数传递(Lambda)

来自分类Dev

将lambda函数作为HOF的参数传递

来自分类Dev

将 OrderBy lambda 函数作为参数传递

来自分类Dev

在Lua中,如何从作为参数传递给函数的函数中获取函数的参数?

来自分类Dev

将函数的引用和 lambda 表达式作为参数传递时有什么区别?

来自分类Dev

获取作为函数参数传递的变量的名称

来自分类Dev

如何将任意lambda作为参数传递给函数(以获取命名层次结构)?

来自分类Dev

传递lambda作为参数

来自分类Dev

传递lambda作为参数

来自分类Dev

std :: transform()在函数参数中传递引用

来自分类Dev

函数参数中传递的对象引用

来自分类Dev

参数在函数中通过引用传递

来自分类Dev

C++:将引用作为参数传递,但该函数不接受引用作为参数

来自分类Dev

在python中传递函数作为参数

来自分类Dev

将函数作为APL中的参数传递

来自分类Dev

将函数作为类中的参数传递

来自分类Dev

将结构作为函数中的参数传递

来自分类Dev

将枚举作为函数中的参数传递

来自分类Dev

Lambda 作为 Android onClicklistener 中的函数参数

来自分类Dev

将参数化的构造函数作为方法引用传递

来自分类Dev

将引用作为函数参数传递不起作用

来自分类Dev

返回作为参数传递给函数的右值引用

来自分类Dev

是否可以将* this作为接受引用(&)的函数的参数传递?

来自分类Dev

将类引用作为构造函数参数传递

来自分类Dev

将lambda函数作为参数传递给需要接口的方法

来自分类Dev

将lambda表达式作为函数参数传递

Related 相关文章

  1. 1

    Lambda函数作为参数传递

  2. 2

    作为参数传递时,在函数中更新指针地址。[将指针作为C中的引用传递]

  3. 3

    将函数引用作为参数传递

  4. 4

    将函数作为参数传递(Lambda)

  5. 5

    将lambda函数作为HOF的参数传递

  6. 6

    将 OrderBy lambda 函数作为参数传递

  7. 7

    在Lua中,如何从作为参数传递给函数的函数中获取函数的参数?

  8. 8

    将函数的引用和 lambda 表达式作为参数传递时有什么区别?

  9. 9

    获取作为函数参数传递的变量的名称

  10. 10

    如何将任意lambda作为参数传递给函数(以获取命名层次结构)?

  11. 11

    传递lambda作为参数

  12. 12

    传递lambda作为参数

  13. 13

    std :: transform()在函数参数中传递引用

  14. 14

    函数参数中传递的对象引用

  15. 15

    参数在函数中通过引用传递

  16. 16

    C++:将引用作为参数传递,但该函数不接受引用作为参数

  17. 17

    在python中传递函数作为参数

  18. 18

    将函数作为APL中的参数传递

  19. 19

    将函数作为类中的参数传递

  20. 20

    将结构作为函数中的参数传递

  21. 21

    将枚举作为函数中的参数传递

  22. 22

    Lambda 作为 Android onClicklistener 中的函数参数

  23. 23

    将参数化的构造函数作为方法引用传递

  24. 24

    将引用作为函数参数传递不起作用

  25. 25

    返回作为参数传递给函数的右值引用

  26. 26

    是否可以将* this作为接受引用(&)的函数的参数传递?

  27. 27

    将类引用作为构造函数参数传递

  28. 28

    将lambda函数作为参数传递给需要接口的方法

  29. 29

    将lambda表达式作为函数参数传递

热门标签

归档