如何将 C# lambda 表达式转换为委托?
Posted
技术标签:
【中文标题】如何将 C# lambda 表达式转换为委托?【英文标题】:How do I convert a C# lambda expression into a delegate? 【发布时间】:2021-06-19 03:12:59 【问题描述】:我不太熟悉 lambda 和委托表达式,但我需要使用 .NET 2 框架,所以我必须使用委托。
假设我有一个例子
process = new Process();
我想通过自定义将其他参数传递给事件:
public void TestHandler(object s, DataReceivedEventArgs e, string mystring)
Console.writeLine(e.Data + "," + mystring);
...
process.OutputDataReceived += new DataReceivedEventHandler((sender, e) => TestHandler(sender, e, "hello"));
我应该如何使用委托来做到这一点?
我尝试过这样做:
public delegate void TestDelegate(object s, DataReceivedEventArgs e, string mystring);
..eg inside main
TestDelegate testDel = delegate(object s,DataReceivedEventArgs e, string mystring) TestHandler (s, e, mystring); ;
process.OutputDataReceived += new DataReceivedEventHandler(testDel);
但我想我错了。
【问题讨论】:
【参考方案1】:如果我理解正确,您可以简单地将 lambda 表达式转换为委托(匿名方法表达式),而无需创建新的委托类型。
改变这个:
(sender, e) => TestHandler(sender, e, "hello")
进入
delegate (object sender, DataReceivedEventArgs e)
TestHandler(sender, e, "hello");
【讨论】:
谢谢。这就是我要找的。span> 【参考方案2】:没有太多上下文我可以去,但DataReceivedEventHandler 的签名是public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);
。它有两个参数,您正试图传递一个带有三个参数的委托:(object s,DataReceivedEventArgs e, string mystring)
。
我猜你必须删除第三个参数string mystring
。
【讨论】:
以上是关于如何将 C# lambda 表达式转换为委托?的主要内容,如果未能解决你的问题,请参考以下文章
实体框架 - 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型
如果不首先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数
无法将 lambda 表达式转换为“字符串”类型,因为它不是委托类型 [重复]
无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型