C#自定义事件及用法实例

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;
    }
}

通过在自定义事件的类中定义委托(EventHanlder)和事件来建立自定义事件。这里FileChanged即为一个自定义事件,其委托类型为 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技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C#程序员统计自己的代码行数

    下面是完整的攻略: C#程序员统计自己的代码行数 背景 当我们参与一个大型的C#项目时,我们可能需要了解我们自己编写的代码行数。通过统计代码行数,不仅可以让我们评估我们的工作量,还可以让我们更好地理解我们在项目中的贡献。在本文中,我们将介绍如何以一种简单的方式统计自己的代码行数。 攻略 下面是一种简单的方法来统计C#代码的行数: 步骤 1:安装cloc cl…

    C# 2023年6月7日
    00
  • Net Core全局配置读取管理方法ConfigurationManager

    在本文中,我们将详细讲解如何在.NET Core中使用ConfigurationManager全局配置读取管理方法,并提供两个示例说明。 准备工作 在开始之前,您需要安装以下软件: .NET Core SDK 使用ConfigurationManager读取配置 在.NET Core项目中添加System.Configuration.Configuratio…

    C# 2023年5月16日
    00
  • C#实现批量下载图片到本地示例代码

    现在我来为您详细讲解C#实现批量下载图片到本地的完整攻略。 具体步骤如下: 第一步:引用必要的命名空间和引用第三方库 首先需要引用 System.Net.WebClient 命名空间,并在项目中引用第三方库 Newtonsoft.Json。 using System.Net; using Newtonsoft.Json; 第二步:获取图片url列表 通过网络…

    C# 2023年6月1日
    00
  • .Net Core 多文件打包压缩的实现代码

    .NET Core 多文件打包压缩的实现代码 在.NET Core应用程序中,有时需要将多个文件打包成一个压缩文件,以便于传输或存储。在本攻略中,我们将介绍如何使用C#代码实现多文件打包压缩,并提供两个示例说明。 1. 使用System.IO.Compression命名空间 在.NET Core应用程序中,可以使用System.IO.Compression命…

    C# 2023年5月16日
    00
  • HttpWebRequest出错.Section=ResponseHeader Detail=CR

    标题:解决 HttpWebRequest 出错 Section=ResponseHeader,Detail=CR 的攻略 可能出现的错误信息: 当使用 HttpWebRequest 请求 Web 服务器端数据时,有可能会出现 Section=ResponseHeader,Detail=CR 的错误提示,该错误提示可能是由于某些特殊字符在服务器端返回的响应中出…

    C# 2023年5月14日
    00
  • C#构造函数在基类和父类中的执行顺序

    C#中的构造函数是用来初始化类中的成员变量的特殊方法。在类继承中,派生类会继承基类的构造函数,同时也可以自定义自己的构造函数。 构造函数在派生类的实例化过程中,会按照一定的规则执行基类和派生类中的构造函数,其执行顺序如下: 先执行基类的构造函数。 继续执行派生类的构造函数。 这个顺序是由 C# 引入的可靠构造函数(Reliable Constructor)原…

    C# 2023年6月7日
    00
  • C# for循环的经典案例集锦

    下面我将为您详细讲解如何实现C#循环的经典案例集锦,包括两个示例。 一、使用for循环实现累加求和 首先,我们来看一个使用for循环实现累加求和的例子。比如需要计算1到100之间的整数之和,实现代码如下: int sum = 0; for(int i=1; i<=100; i++) { sum += i; } Console.WriteLine(&qu…

    C# 2023年5月15日
    00
  • 使用VS2019生成C#应用安装包的方法步骤

    下面是详细的攻略步骤。 使用VS2019生成C#应用安装包的方法步骤 1. 准备工作 在生成C#应用安装包前,我们需要先进行一些准备工作: 确认已经安装了Microsoft Visual Studio 2019。 确认已经创建了C#应用程序,并且应用能够正常地运行。 确认已经安装了Visual Studio Installer Projects扩展。如果还未…

    C# 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部