将参数传递给事件处理程序

22

我想通过我的事件将我的List<string>作为参数传递。

public event EventHandler _newFileEventHandler;
    List<string> _filesList = new List<string>();

public void startListener(string directoryPath)
{
    FileSystemWatcher watcher = new FileSystemWatcher(directoryPath);
    _filesList = new List<string>();
    _timer = new System.Timers.Timer(5000);
    watcher.Filter = "*.pcap";
    watcher.Created += watcher_Created;            
    watcher.EnableRaisingEvents = true;
    watcher.IncludeSubdirectories = true;
}

void watcher_Created(object sender, FileSystemEventArgs e)
{            
    _timer.Elapsed += new ElapsedEventHandler(myEvent);
    _timer.Enabled = true;
    _filesList.Add(e.FullPath);
    _fileToAdd = e.FullPath;
}

private void myEvent(object sender, ElapsedEventArgs e)
{
    _newFileEventHandler(_filesList, EventArgs.Empty);;
}

我希望从我的主表单中获取这个列表:

void listener_newFileEventHandler(object sender, EventArgs e)
{

}
2个回答

70

创建一个新的EventArgs类,如下所示:

    public class ListEventArgs : EventArgs
    {
        public List<string> Data { get; set; }
        public ListEventArgs(List<string> data)
        {
            Data = data;
        }
    }

并将您的活动设定为这样:

    public event EventHandler<ListEventArgs> NewFileAdded;

添加一个触发方法:

protected void OnNewFileAdded(List<string> data)
{
    var localCopy = NewFileAdded;
    if (localCopy != null)
    {
        localCopy(this, new ListEventArgs(data));
    }
}

当您想要处理此事件时:

myObj.NewFileAdded += new EventHandler<ListEventArgs>(myObj_NewFileAdded);

处理程序方法看起来会像这样:

public void myObj_NewFileAdded(object sender, ListEventArgs e)
{
       // Do what you want with e.Data (It is a List of string)
}

2
只是作为一则附注,考虑从 EventArgs(或 EventArgs 层次结构中的其他合适类)继承。 - James Michael Hare
在我的类中,我使用FileSystemWatcher监听文件夹。当有新文件到达时,我将其添加到我的列表中,并触发我的事件。所以我应该已经拥有事件(public event EventHandler _newFileEventHandler;)。请看我的更新。 - user1269592
我知道,在添加新的“ListEventArgs”类(注意:它应该继承自EventArgs类)后,你应该将定义更改为public event EventHandler <ListEventArgs> _newFileEventHandler; - Saw
我为什么要改变它呢? - user1269592
我已经将名称更改为类似于您的情况:)您需要更改的唯一内容是更改事件处理程序,您不应将事件命名为xxxxxEventHandler,这不好,因为事件处理程序是其他内容,我已将事件命名为:FileAdded。 - Saw
1
我对你的 OnNewFileAdded 函数进行了小改动。如果你有一个多线程应用程序,并且最后一个调用者在空值检查和委托调用之间取消订阅事件,那么你将会得到一个 NullRefrenceException 异常。通过先将委托复制到一个临时变量中,可以防止这种情况发生。 - Scott Chamberlain

7

您可以定义事件的签名为任何您想要的。如果事件需要提供的唯一信息是该列表,那么只需传递该列表:

public event Action<List<string>> MyEvent;

private void Foo()
{
     MyEvent(new List<string>(){"a", "b", "c"});
}

当订阅事件时:

public void MyEventHandler(List<string> list)
{
    //...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接