【问题标题】:Lambda expression instead of DelegateLambda 表达式而不是 Delegate
【发布时间】:2018-11-01 15:07:51
【问题描述】:

我有Delegatea:

    public delegate void doLog( String value , RichTextBox lger ) ;

    public void doLg(String value, RichTextBox lger)
    {
        lger.AppendText(value);
    }

    doLog a = new doLog(doLg);

我在Invoke 通话中使用此委托:

_textBox.Invoke(a, new Object[] { "aaaa", _textBox });

如何使用 lambda 表达式让这一切变得更简单?

【问题讨论】:

  • 我不确定你想用 lambda 实现什么。 “更简单”是什么意思?

标签: c# lambda delegates


【解决方案1】:

我能想到的最简单的一个班轮就是这个

_textBox.Invoke(new Action(() => { doLog("aaaa", _textBox); }));

(它正在工作,因为 Action 只是委托)

【讨论】:

  • 为什么不只是() => Console.WriteLine(false)?
  • 因为Cannot convert lambda expression to type 'Delegate' because it is not a delegate type
  • 根据 OP 示例将 Console.WriteLine(false) 编辑为 doLog("aaaa", _textBox)
【解决方案2】:

如果它变得更好,你可以使用Action:

Action<string, RichTextBox> a = (value, lger) => { };

_textBox.Invoke(a, new object[] { "aaaa", _textBox });

【讨论】:

  • 听起来您确实想使用操作委托,但您没有提供足够的信息来准确显示您这样做的目的或原因。
  • 问题基本上是:“如何使用 lambda 表达式让这一切变得更简单?”这个答案通过一个动作使用 lambda 表达式来实现完全相同的事情。
【解决方案3】:

综合以上两个答案,我认为这是最好的折衷方案:

textBox1.Invoke(new Action(() => { /* your code here */ }), new object[] { "a", "b" });

编辑;借用了question

编辑 2;带参数的示例:

textBox1.Invoke(new Action<string, RichTextBox>((a, b) => {}), new object[] {"a", new RichTextBox() });

【讨论】:

  • 你的回答比Spixy的回答增加了什么?
  • 第二个参数和对另一个问题的引用,其中首先回答了导致此问题的编译错误。所以基本上它更完整,也有一些背景。
  • 它工作正常...只是在一个虚拟的 Windows 窗体项目中运行它。
  • 不正确,如果您需要参数,则需要指定它们。添加了一个示例。
  • 在你的第一个代码中,你提供了一个无参数的动作和参数。这对我来说似乎是错误的/没用的。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多