【问题标题】:Action<Action<string,int>> and Lambda Expression in C#C# 中的 Action<Action<string,int>> 和 Lambda 表达式
【发布时间】:2016-04-07 10:57:49
【问题描述】:

我已经对此进行了搜索,但我真的不知道如何用这个问题来回答问题,到目前为止,我在 Lambda 表达式这样的嵌套操作上找不到任何东西。我可以找到很多关于将 lambda 表达式作为参数传递的帮助,其中参数是委托,事实上我在我的代码中做了很多。给我带来问题的是嵌套的 lambda 表达式。

我有一个具有类型属性的类

Action<Action<string,int>> myAction

我想给它分配一个 Lambda 表达式。我可以在没有 Lambda 表达式的情况下使用代码中其他地方的真实方法来做到这一点。我也可以做一些简单的事情,比如

myAction = ((a) => { a("a string", 0); });

但我想在一个 Lambda 中分配子操作和操作。比如……

myAction = (((s,i)=>{//sub-action body here})=> { //do something here});

但是这种语法不起作用。有没有办法做到这一点,或者如果我想这样做,我必须提前定义我的方法并在没有 Lambda 表达式的情况下做到这一点?

【问题讨论】:

  • 子动作作为输入参数传递给动作,我不明白你想给它分配什么。
  • 我不得不想了很多关于为什么我不能这样做。答案是我正在调用一个没有参数的方法(上面未显示),但调用了存储在“myAction”属性中的方法。 myAction 需要知道要传递给子操作的 s & i 参数。在大多数情况下,我使用这个 myAction 并且 subaction 定义在不同的地方,并且完全写成方法,但是在这个地方我需要将两者一起定义,并希望使用 lambda 表达式来保持简洁并避免写出完整的方法。 Tsayper 下面的解决方案似乎得到了我所需要的。

标签: c# lambda delegates


【解决方案1】:
        Action<Action<string, int>> myAction = a => (new Action<string, int>((s, i) => Console.WriteLine(i + s)))("hello", 1);
        myAction(null);  //1hello
        Console.ReadLine();

虽然它等于

        Action<Action<string, int>> myAction = a => Console.Writeline("1hello");

你只是忽略了一个论点

【讨论】:

  • 谢谢 :) 我很确定这就是我要找的。我已经用我的其余代码运行了很多测试,它似乎表现得如我所愿。是的,在您的示例中可以简化,但在我的情况下,我想要的行为需要类似于您给出的第一个示例。我只是在进行更多测试,但我认为一旦我完成了这将是公认的答案。
  • 我现在认为它就像您的简化示例一样简单。当我在同一个地方指定两者时,简单地指定 myAction 是有意义的。我有两个动作允许它们被单独定义,但在这种情况下不需要两个级别,所以这个解决方案只是有效地忽略了子动作,而 myAction 代替了它。另一方面,如果我只想使用 lambda 将值放入 s & i 参数中(而不是覆盖子操作),我可以使用我的问题中的中间代码行。感谢您帮助我将要求简化为最简单的形式:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多