C# Action委托类型

本文介绍如何使用反射机制实现在主窗体FrmMain中动态加载FrmProject.Dll,并利用Action委托类型传递窗体间的数据。重点在于解决类库窗体与主窗体之间的通讯问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:项目中用到动态Dll,需要用到反射的知识。先在一个解决方案中,有一个项目时类库FrmProject,类库中包含有窗体,另一个项目是运行时的主窗体 FrmMain!主窗体是通过动态加载FrmProject.Dll! 类库中的窗体不能直接在主窗体中实例出来。现需要在FrmProject类库中的窗体点击一个复选框后,将得到的结果传递给主窗体! 最大问题的是,不能通过自定义的委托类型来实现,这个有点难说明白,估计只有遇到了才比较清楚。

最后是通过 Action<> 委托类型 来实现!以下是Action<>的定义:

#region 程序集 mscorlib.dll, v4.0.0.0
// C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll
#endregion

namespace System
{
    // 摘要: 
    //     封装一个方法,该方法只有一个参数并且不返回值。
    //
    // 参数: 
    //   obj:
    //     此委托封装的方法的参数。
    //
    // 类型参数: 
    //   T:
    //     此委托封装的方法的参数类型。
    public delegate void Action<in T>(T obj);
}

比较容易理解的例子:Action委托类型   !

Action是一个无返回值的委托,Func是一个有返回值的委托,具体用法可以百度或是看帮助文档!


### C# 中 `Action` 委托的定义与用法 在 C# 中,`Action` 是一种预定义的泛型委托类型[^2]。它表示不返回任何值 (`void`) 的方法,并可以接受零个或多个输入参数。具体来说: - 如果没有参数,则可以直接使用 `Action`。 - 如果有参数,则可以通过指定类型的列表来创建相应的 `Action<T>` 或更复杂的版本。 以下是关于 `Action` 委托的一些重要特性及其用途: #### 定义 `Action` 委托是一个通用的函数指针形式,允许开发者传递无返回值的方法作为参数或者存储它们以便稍后调用。它的主要优势在于简化了代码结构并增强了灵活性。 对于不同数量和类型的参数支持如下几种变体: - **Action**: 表示没有任何参数也没有返回值的操作。 - **Action<T>**: 接受单个 T 类型参数且无返回值。 - **Action<T1, T2,...Tn>**: 可以扩展到最多 16 个不同类型参数的情况。 #### 使用场景 当希望向某个方法传入一段逻辑而不需要关心其执行细节时非常有用;另外,在事件处理程序注册以及异步编程模型中也经常能看到它的身影。 下面给出几个具体的例子展示如何声明及运用这种特殊的委托类型: ```csharp // Example without parameters. public void DoWork() { Console.WriteLine("Working..."); } class Program { public static void Main(string[] args) { var worker = new Worker(); // Assigning method directly. Action actionDelegate = worker.DoWork; // Invoking through delegate instance. actionDelegate(); // Lambda expression approach. Action lambdaAction = () => { Console.WriteLine("Lambdas work too!"); }; lambdaAction(); } } ``` 上述实例展示了两种方式初始化一个简单的 `Action` 对象——通过现有方法引用或是利用匿名函数即Lambda表达式完成相同功能。 再看带有一个整数参数的例子: ```csharp static void PrintNumber(int number){ System.Console.WriteLine(number); } class TestClass { public static void Main(){ int num=42; // Using predefined Action<int> Action<int> printNumDel=new Action<int>(PrintNumber); // Call via delegate printNumDel(num); // Alternatively with inline assignment & invocation using lambda syntax ((Action<int>)((x)=>System.Console.WriteLine(x)))(num*2); } } ``` 以上演示了怎样构建接收单一数值参数的动作代理,并分别采用传统做法还有即时定义加立即执行的形式呈现出来。 最后值得注意的是虽然这里讨论的重点放在标准库所提供的便捷工具上但实际上自定义类似的轻量级解决方案同样可行只要遵循基本语法即可实现同等效果甚至可能更加贴合特定需求情境下的特殊约束条件等等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值