C# 类扩展方法

C# 类扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用

下面以一个代码例子说明

定义一个 Npc 类

  // 定义 Npc 类
    public class Npc
    {
        //定义字段变量
        private int npcId;
        private string name;

        public Npc() { }

        //定义字段变量对应的属性
        public int NpcID
        {
            get { return npcId; }
            set { npcId = value; }
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

创建一个实例
Npc npc = new Npc();
想使用下面方法,给 NpcId 和 Name 变量赋值
npc.SetIDName(npcId, name)

SetIDName 函数在 Npc 类中并没有定义

实现方案
一:Npc 类派生出一个子类,然后在子类中添加 SetIDName(int npcId, string name) 方法
二:给 Npc 类添加扩展方法

下面代码直接给 Npc 类扩展出来一个新的方法

    // 扩展 Npc 类
    public static class ExtendNpc
    {
        // 给 Npc 类扩展一个方法 
        // SetIDName(this Npc npc, int id, string name)
        public static void SetIDName(this Npc npc, int id, string name)
        {
            npc.NpcID = id;
            npc.Name = name;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            // 实例一个 Npc 对象
            Npc npc = new Npc();

            // Npc 类对象就可以直接调用扩展方法了
            npc.SetIDName(1000, "HeHe");

            int npcId = npc.NpcID;
            string name = npc.Name;

            Console.WriteLine("npcId    :" + npcId);
            Console.WriteLine("name     :" + name);

            Console.ReadLine();
        }
    }

上面方法轻松实现给 Npc 类添加一个SetIDName方法

扩展方法要点:
一、定义的扩展类必须为静态类如上
public static class ExtendNpc

二、定义的扩展方法必须为静态方法如上
public static void SetIDName(this Npc npc, int id, string name)

三、扩展方法的第一个参数必须使用 this 指定该方法用于那种类型如上SetIDName(this Npc npc, int id, string name) 该方法只能 Npc 类的对象调用。

四、如果 Npc 类本身已经定义了一个 SetIDName 方法,则扩展方法中的 SetIDName无效,即如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。

建议:
只建议你无法更改源代码来扩充你需要的方法时实现扩展方法,并谨慎地实现。只要有可能,最好重构原始类,或从现有类派生子类来达到这一目的。使用类源代码的更改可能会导致扩展方法失效。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值