在C#中,将lambda表达式或匿名函数转换为委托对象的最直接方式是什么?

在C#中,将lambda表达式或匿名函数转换为委托对象的最直接方式是什么?,c#,multithreading,lambda,delegates,expression,C#,Multithreading,Lambda,Delegates,Expression,我正在编写一些代码来解决系统中的线程安全问题,推荐的方法之一是使用委托来解决跨线程问题。但出于某种原因,我不喜欢为可能需要拦截的每一个操作定义委托,因此更喜欢使用匿名方法或lambda表达式,但我认为编译器拒绝将其中任何一个强制转换为System.delegate对象 这有捷径吗 如果(someListBox.InvokeRequested) { 调用(Some_System.Delegate_对象,新对象[]{item}); } 否则 someListBox.Items.Add(item) 我

我正在编写一些代码来解决系统中的线程安全问题,推荐的方法之一是使用委托来解决跨线程问题。但出于某种原因,我不喜欢为可能需要拦截的每一个操作定义委托,因此更喜欢使用匿名方法或lambda表达式,但我认为编译器拒绝将其中任何一个强制转换为System.delegate对象

这有捷径吗

如果(someListBox.InvokeRequested)
{
调用(Some_System.Delegate_对象,新对象[]{item});
}
否则
someListBox.Items.Add(item)

我想要像

如果(someListBox.InvokeRequested)
{
调用((i)=>{someListBox.Items.Add(i);},新对象[]{item});
}
否则
someListBox.Items.Add(item)


您的问题之一是编译器无法推断lamda的参数类型。即使对于给定的参数签名,也有无限多的潜在委托类型。所以需要显式地给出一个类型<如果不关心参数名称,则代码>操作和
函数
是典型的候选参数

我认为这应该奏效:

`someListBox.Invoke((Action<int>)((i) => {listviewResults.Items.Add(i); }), new object[] {item});`

您想要的方法的缺点是实际工作将在两个地方实现。一种替代方法可能如下所示:

private void AddItemToListView(ListViewItem item, ListView listView)
{
    if (listView.InvokeRequired)
    {
        listView.BeginInvoke((Action)delegate { AddItemToListView(item, listView); });
    }
    else
    {
        listView.Items.Add(item);
    }
}
然后,您可以再次讨论此代码的执行频率。如果不是非常多,那么最好不要检查
invokererequired
,而是始终将调用包装在传递给
BeginInvoke
的委托中,从而简化调用:

private void AddItemToListView(ListViewItem item, ListView listView)
{
    listView.BeginInvoke((Action)delegate { listView.Items.Add(item); });       
}

谢谢,我不知道这种直接使用动作的技巧;第二个对我有用。事实上,C#为我们省下了很多痛苦:)
private void AddItemToListView(ListViewItem item, ListView listView)
{
    if (listView.InvokeRequired)
    {
        listView.BeginInvoke((Action)delegate { AddItemToListView(item, listView); });
    }
    else
    {
        listView.Items.Add(item);
    }
}
private void AddItemToListView(ListViewItem item, ListView listView)
{
    listView.BeginInvoke((Action)delegate { listView.Items.Add(item); });       
}