调用EventHandler泛型,TargetParameterCountException

时间:2010-03-20 18:32:03

标签: c# generics invoke event-handling

我有一个DirectoryMonitor类,可以在另一个线程上运行。 它声明了以下事件:

public class DirectoryMonitor
{
    public event EventHandler<MonitorEventArgs> CreatedNewBook;
    public event EventHandler ScanStarted;
    ....
}

public class MonitorEventArgs : EventArgs
{
    public Book Book { get; set; }
}

有一个使用该监视器的表单,在收到事件后,它应该更新显示。

现在,这有效:

    void DirectoryMonitor_ScanStarted(object sender, EventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke(new EventHandler(this.DirectoryMonitor_ScanStarted));
        }
        else {...}
    }

但这会引发TargetParameterCountException

    void DirectoryMonitor_CreatedNewBook(object sender, MonitorEventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke(new EventHandler<MonitorEventArgs>(this.DirectoryMonitor_CreatedNewBook));
        }
        else {...}
    }

我错过了什么?

2 个答案:

答案 0 :(得分:2)

Invoke方法除了接收System.Delegate实例外,可以在不传递任何其他参数的情况下调用该实例。使用DirectoryMonitor_ScanStarted创建的委托需要2个参数,因此在使用时会出现异常。

您需要创建一个新的委托,它将调用和参数包装在一起。

MethodInvoker del = () => this.DirectoryMonitor_ScanStarted(sender,e);
Invoke(del);

答案 1 :(得分:0)

您缺少参数: -

void DirectoryMonitor_ScanStarted(object sender, MonitorEventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke(new EventHandler<MonitorEventArgs>(DirectoryMonitor_ScanStarted), sender, e);
        }
        else {...}
    }

由于我不清楚的原因(可能是由于COM遗留问题),允许在使用通用事件时省略参数,但在使用用户定义的EventArg类型时则不允许。