当前位置: 首页 > news >正文

C#扩展方法(Extension Method)

在 C# 中,扩展方法(Extension Method)的语法允许你通过 this 关键字将第一个参数隐式传递,因此在调用时 ​不需要显式传递第一个参数。

这里有个扩展方法

public static Task<T> InvokeAsync<T>(this Control control, Func<T> func)
{var tcs = new TaskCompletionSource<T>();control.BeginInvoke(new Action(() =>{try{tcs.SetResult(func());}catch (Exception ex){tcs.SetException(ex);}}));return tcs.Task;
}

扩展方法的特点:

**​隐式 control 参数:**this Control control 表示这是一个扩展方法,作用在 Control 类型上。当你调用 _uiControl.InvokeAsync(showDialogFunc) 时,_uiControl 会自动作为 control 参数传递,而 showDialogFunc 是第二个参数 func。
**​泛型参数 <T>:**InvokeAsync<T> 的泛型参数 <T> 会根据 func 的返回值类型自动推断。例如,如果 showDialogFunc 返回 string,则 T 会被推断为 string。

调用时的参数传递:

return await _uiControl.InvokeAsync(showDialogFunc);
_uiControl 是扩展方法的第一个参数 control(通过 this Control control 隐式传递)。
showDialogFunc 是第二个参数 func。

为什么不需要显式传递两个参数?

扩展方法的语法简化了调用方式:
原本需要写为 InvokeAsync(_uiControl, showDialogFunc)。
但因为 this Control control 的存在,你可以直接写成 _uiControl.InvokeAsync(showDialogFunc),编译器会自动将 _uiControl 作为第一个参数。

完整流程解析:

线程切换:
如果当前线程不是 UI 线程,control.BeginInvoke 会将 func 委托的调用调度到 UI 线程。
如果当前已经是 UI 线程,BeginInvoke 会直接执行(同步或异步取决于具体实现)。
​异步包装:
TaskCompletionSource 用于将 BeginInvoke 的异步操作包装成一个 Task。
当 func 在 UI 线程执行完成后:
如果成功,调用 tcs.SetResult(func()) 设置结果。
如果抛出异常,调用 tcs.SetException(ex) 传递异常。
​ 返回 Task:
最终返回的 tcs.Task 可以让调用者通过 await 等待结果。

总结:

​**扩展方法的语法:通过 this 关键字隐式传递第一个参数(control),调用时不需要显式传递。
泛型推断:**根据 func 的返回值类型自动推断泛型参数 。
​线程安全: BeginInvoke 确保 func 在 UI 线程执行,并通过 Task 提供异步支持。

http://www.xdnf.cn/news/241345.html

相关文章:

  • Python生活手册-文件二进制:从快递柜到生鲜冷链的数据保鲜术
  • 健康生活新主张:全方位养生指南
  • Linux 命令如何同时支持文件参数与管道输入?
  • 基于数字图像处理的裂缝检测与识别系统(Matlab)
  • 安川机器人常见故障报警及解决办法
  • Flink流式计算核心:DataStream API与时间语义深度解析
  • 安装linux下的idea
  • 【Redis分布式】主从复制
  • 【精选】基于数据挖掘的广州招聘可视化分析系统(大数据组件+Spark+Hive+MySQL+AI智能云+DeepSeek人工智能+深度学习之LSTM算法)
  • Ollama 本地运行 Qwen 3
  • 短视频矩阵系统:源码搭建与定制化开发的深度剖析
  • Pinia: vue3状态管理
  • 算法--模拟题目
  • 算法笔记.试除法判断质数
  • 【经管数据】A股上市公司资产定价效率数据(2000-2023年)
  • 油气人工地震资料信号处理中,机器学习和AI应用
  • 科学养生,解锁健康生活密码
  • Scala 循环
  • openEuler 22.03 安装 Mysql 5.7,TAR离线安装
  • Python与深度学习:自动驾驶中的物体检测,如何让汽车“看懂”世界
  • 【现代深度学习技术】现代循环神经网络02:长短期记忆网络(LSTM)
  • 【Linux系统】Linux进程信号(产生,保存信号)
  • WGCLOUD使用 - 如何监控RabbitMQ运行参数
  • Lebesgue测度和积分理论发展概观
  • ThreadLocal详解
  • 从工厂到生活:算法 × 深度学习,正在改写自动化的底层逻辑
  • Js扩展DOM、BOM、AJAX、事件、定时器
  • react学习笔记2——基于React脚手架与ajax
  • DBeaver虚拟主键会影响实际的数据库吗
  • 贝叶斯算法实战:从原理到鸢尾花数据集分类