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

C#扩展方法的入门理解

public static class CanGetModelExtension
{public static T GetModel<T>(this ICanGetModel self) where T : class, IModel =>self.GetArchitecture().GetModel<T>();
}

前言:

        在学习QFramework时,看底层框架代码注意到这个函数,对于我一个小白来说不明所以,于是GPT了一下,才知道这是一个对ICanGetModel接口的扩展方法,于是想对C#扩展方法进行拆解理解一下,遂笔。

扩展方法的基本语法

public static 返回类型 方法名(this 目标类型 参数名, 其他参数...)
{// 方法实现
}
  • this 关键字:表示这是一个扩展方法。
  • 目标类型:你要扩展的接口(这里是 ICanGetModel)。
  • 参数名:调用该方法的实例(通常命名为 self 或 source)。
  • 任何实现了 ICanGetModel 的类都可以直接调用 GetModel<T>() 方法。

使用扩展方法前后代码对比

假设有一个 ICanGetModel 的实现类 GameSystem

public class GameSystem : ICanGetModel 
{ public IArchitecture GetArchitecture() => GameApp.Interface; 
}

(1) 不使用扩展方法

var system = new GameSystem(); 
var model = system.GetArchitecture().GetModel<PlayerModel>(); // 冗长

(2) 使用扩展方法

var system = new GameSystem(); 
var model = system.GetModel<PlayerModel>(); // 简洁直观

扩展方法的本质

  • 扩展方法只是 语法糖,编译后会变成普通的静态方法调用。
  • 它不会修改原始类或接口的实现,只是让调用更便捷。

示例代码Animal使用扩展方法

### 1.定义基类 `Animal` 和派生类
public class Animal
{public string Name { get; set; }public void Speak() => Console.WriteLine($"{Name} makes a sound.");
}public class Dog : Animal
{public void Bark() => Console.WriteLine($"{Name} says: Woof!");
}public class Cat : Animal
{public void Meow() => Console.WriteLine($"{Name} says: Meow!");
}### 2. 定义扩展方法
#### (1) 为 `Animal` 添加扩展方法
public static class AnimalExtensions
{// 扩展方法:让动物重复说话多次public static void RepeatSpeak(this Animal animal, int times){for (int i = 0; i < times; i++){animal.Speak();}}// 扩展方法:检查动物是否是无名氏public static bool IsNameless(this Animal animal){return string.IsNullOrEmpty(animal.Name);}
}#### (2) 为 `Dog` 添加专属扩展方法
public static class DogExtensions
{// 扩展方法:让狗疯狂吠叫public static void CrazyBark(this Dog dog, int barkCount){for (int i = 0; i < barkCount; i++){dog.Bark();}}
}### 3. 使用扩展方法
class Program
{static void Main(){// 创建一个动物和一只狗var genericAnimal = new Animal { Name = "Generic Animal" };var dog = new Dog { Name = "Buddy" };// 调用 Animal 的扩展方法genericAnimal.RepeatSpeak(3); // 输出 3 次 "Generic Animal makes a sound."Console.WriteLine($"Is nameless? {genericAnimal.IsNameless()}"); // 输出 False// 调用 Dog 的扩展方法(继承自 Animal 的也可以调用)dog.RepeatSpeak(2); // 输出 2 次 "Buddy makes a sound."dog.CrazyBark(3);   // 输出 3 次 "Buddy says: Woof!"}
}

总结

  1. 扩展方法的语法

    • 必须定义在 静态类 中(如 AnimalExtensions)。
    • 方法本身必须是 静态方法
    • 第一个参数用 this 修饰,表示要扩展的类型(如 this Animal animal)。
  2. 扩展方法的调用

    • 实例可以直接调用扩展方法,就像调用自己的方法一样。
    • 例如:dog.RepeatSpeak(2),尽管 RepeatSpeak 不是 Dog 的成员方法。
  3. 扩展方法的限制

    • 不能访问类的私有成员(因为本质是静态方法)。
    • 如果类本身有同名方法,实例方法优先级更高。
  4. 扩展方法的作用

    • 增强现有类:无需修改原始类,就能添加新功能。
    • 链式调用:例如 LINQ 的 Where().Select()

相关文章:

  • 标签部件(lv_label)
  • 进阶2_1:QT5多线程与定时器共生死
  • python:一个代理流量监控的媒体文件下载脚本
  • Docker使用经验-从Image导出dockerfile并进行修改
  • Spark处理过程--案例数据清洗
  • Unity引擎源码-物理系统详解-其二
  • 智能体制作学习笔记1——智能体
  • 软件设计师-下午题-试题4(15分)
  • 深入掌握 Python 切片操作:解锁数据处理的高效密码
  • 基于 Kubernetes 部署容器平台kubesphere
  • 基于网关实现不同网段S7-1200 CPU的通信方法
  • 【Spark分析HBase数据】Spark读取并分析HBase数据
  • 互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-6
  • Python 之 selenium 打开浏览器指定端口进行接续操作
  • 机器人示教操作
  • excel使用笔记
  • 【2025版】Spring Boot面试题
  • Flutter 开发入门:从一个简单的计数器应用开始
  • Problem E: List练习
  • Linux架构篇、第五章_02git2.49.0分支管理与Gitee的部署
  • 牛市早报|4月新增社融1.16万亿,降准今日正式落地
  • 今年前4个月上海对拉美国家进出口总值增长2%
  • 日本航空自卫队一架练习机在爱知县坠毁
  • 首个偏头痛急性治疗药物可缓解前期症状
  • 俄乌拟在土耳其举行会谈,特朗普:我可能飞过去
  • 湖南湘西州副州长刘冬生主动交代问题,接受审查调查