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