C#自定义事件及用法实例
在C#编程中,事件是编写高效程序不可缺少的一个重要部分。在C#中,可以使用内置的事件(System.EventHandler)来对事件进行处理。同时,也可以使用自定义的事件来实现特定要求的事件处理。
本文将详细介绍C#自定义事件及用法实例,帮助读者更好地理解事件机制并掌握自定义事件的应用。
什么是C#自定义事件
自定义事件是基于内置事件机制,通过编写自定义事件处理程序来实现的一种事件处理方式。其中,自定义事件处理程序是通过自定义事件的类来创建的。自定义事件可以与内置事件机制一样,具有触发器和处理程序两个重要的组成部分。
public class CustomEventArgs : EventArgs
{
public string FileName { get; set; }
}
定义自定义事件处理程序的类需要从 EventArgs 类继承,并在类中
public class FileWatcher
{
public event EventHandler<CustomEventArgs> FileChanged;
protected virtual void OnFileChanged(CustomEventArgs e)
{
FileChanged?.Invoke(this, e);
}
public void Watch(string directoryPath)
{
var watcher = new FileSystemWatcher(directoryPath);
watcher.Changed += (sender, e) => OnFileChanged(new CustomEventArgs { FileName = e.Name });
watcher.EnableRaisingEvents = true;
}
}
通过在自定义事件的类中定义委托(EventHanlderFileChanged
即为一个自定义事件,其委托类型为 EventHandler<CustomEventArgs>
,通过定义事件的触发方法OnFileChanged
来激活该事件。触发 FileChanged
事件时传递 CustomEventArgs
参数来允许事件处理程序运行时处理特定的数据。
在 Watcher 方法中创建 FileSystemWatcher 对象,将要监视的目录路径传到它的构造函数中,并使用 FileSystemWatcher 的 Events 属性来注册 Changed 事件的事件处理程序,以便能在文件改变时触发自定义事件。
利用 FileWatcher 类,我们可以在指定目录下监控文件变化,然后根据 The event that is triggered upon a file delete 的需求,定义一个委托来创建一个事件处理程序,并将其注册到 FileWatcher 的自定义事件上
static void Main(string[] args)
{
var fileWatcher = new FileWatcher();
fileWatcher.FileChanged += OnFileChanged;
fileWatcher.Watch(@"C:\Users\jacob\Desktop\Test");
Console.ReadLine();
}
private static void OnFileChanged(object sender, CustomEventArgs e)
{
Console.WriteLine($"File [{e.FileName}] was changed!");
}
实例1:自定义事件处理文件剪切函数
public class FileManager
{
public event EventHandler<FileChangeEventArgs> FileChanged;
public event EventHandler<FileChangeEventArgs> FileCopied;
public void Cut(string origin, string destination)
{
File.Move(origin, destination);
OnFileChanged(FileChangeType.Move, origin, destination);
}
protected virtual void OnFileChanged(FileChangeType type, string oldPath, string newPath)
{
if(FileChanged != null)
{
FileChanged(this, new FileChangeEventArgs(type, oldPath, newPath));
}
}
public void Copy(string origin, string destination)
{
File.Copy(origin, destination);
OnFileCopied(FileChangeType.Copy, origin, destination);
}
protected virtual void OnFileCopied(FileChangeType type, string oldPath, string newPath)
{
if (FileCopied != null)
{
FileCopied(this, new FileChangeEventArgs(type, oldPath, newPath));
}
}
}
public class FileChangeEventArgs : EventArgs
{
public FileChangeType Type { get; }
public string OldPath { get; }
public string NewPath { get; }
public FileChangeEventArgs(FileChangeType type, string oldPath, string newPath)
{
Type = type;
OldPath = oldPath;
NewPath = newPath;
}
}
public enum FileChangeType
{
Move,
Copy
}
public class Test
{
static void Main(string[] args)
{
var fileManager = new FileManager();
fileManager.FileChanged += OnFileChanged;
fileManager.FileCopied += OnFileCopied;
fileManager.Cut(@"C:\Users\jacob\Desktop\Test\Test.txt", @"C:\Users\jacob\Desktop\Test\New\Test.txt");
fileManager.Copy(@"C:\Users\jacob\Desktop\Test\Test2.txt", @"C:\Users\jacob\Desktop\Test\New\Test2.txt");
Console.ReadLine();
}
private static void OnFileChanged(object sender, FileChangeEventArgs e)
{
Console.WriteLine($"File [{e.OldPath}] was {e.Type.ToString().ToLower()}d to [{e.NewPath}]");
}
private static void OnFileCopied(object sender, FileChangeEventArgs e)
{
Console.WriteLine($"File [{e.OldPath}] was {e.Type.ToString().ToLower()}ied to [{e.NewPath}]");
}
}
实例2:事件的发起者和接受者
- 事件发起者
public class Button
{
public event EventHandler Click;
public void ClickButton()
{
Click?.Invoke(this, EventArgs.Empty);
}
}
- 事件接受者
public class Window
{
private readonly Button _button;
public Window()
{
_button = new Button();
_button.Click += OnButtonClick;
}
private void OnButtonClick(object sender, EventArgs e)
{
Console.WriteLine("Button clicked!");
}
}
Window 类中使用事件发起者 Button,让程序可以在按钮单击时调用与该事件相关联的回调方法。当单击按钮时,触发 Click 事件(利用事件触发器Click?.Invoke(this, EventArgs.Empty);
),该事件会通知所有被注册的监听器,事件接收者 Window 中的 OnButtonClick 方法就是其中的一个监听器,用来处理事件处理程序中定义的业务逻辑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#自定义事件及用法实例 - Python技术站