委托类型无法转换匿名方法

时间:2013-12-04 07:22:58

标签: c# winforms

在以下行“this.dgvReport.Invoke(delegate”

)中收到错误
  

“无法将匿名方法转换为'System.Delegate'类型,因为它不是委托类型”

    public void FillProductGrid()
    {
        ProductSP productSP = new ProductSP();
        DataTable dtbl = new DataTable();
        string productname = "";
        dtbl = productSP.StockReport(productname, this.cbxPrint.Checked);
        this.dgvReport.Invoke(delegate
        {
            this.dgvReport.DataSource = dtbl;
        });
    }

2 个答案:

答案 0 :(得分:8)

只需将转换添加到具有相同签名的某个委托类型:

this.dgvReport.Invoke((MethodInvoker)(delegate {
        this.dgvReport.DataSource = dtbl;
}));

答案 1 :(得分:4)

Invoke方法的参数类型为Delegate,您只能将匿名函数转换为特定的委托类型。您需要转换表达式,或者(我的首选选项)使用单独的局部变量:

// Or MethodInvoker, or whatever delegate you want.
Action action = delegate { this.dgvReport.DataSource = dtbl; };
dgvReport.Invoke(action);

或者,您可以在Control上创建一个特殊情况下的特殊委托的扩展方法,这可以使其更简单:

public static void InvokeAction(this Control control, Action action)
{
    control.Invoke(action);
}

然后:

dgvReport.InvokeAction(delegate { dgvReport.DataSource = dtbl; });

还要考虑使用lambda表达式:

dgvReport.InvokeAction(() => dgvReport.DataSource = dtbl);