C# 静态扩展方法

C#提供了静态扩展方法可以在不更改或者没办法更改原有组件代码的情况实现一些定义的扩展方法,扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用

静态扩展方法有如下的特征

  • 静态扩展方法位于静态类中,并且以static修饰符修饰
  • 静态扩展方法的第一个参数以this修饰符为前缀,后跟要扩展的目标类型及参数
  • 静态扩展方法只能针对实例调用,即:静态类不能作为目标类
  • 扩展方法的优先级总是比类型本身中定义的实例方法低,即:如果扩展方法和被扩展类中的某个签名相同则扩展方法永远不会被调用

使用

先假设已经存在一个MyMath类,类中实现了IMyMath接口中的Add和Multi方法

namespace ConsoleApp1
{
    /// <summary>
    /// 接口
    /// </summary>
    public interface IMyMath
    {
        /// <summary>
        /// 加法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        int Add(int x, int y);

        /// <summary>
        /// 乘法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        int Multi(int x, int y);
    }
}
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApp1
{
    /// <summary>
    /// Math类,此处作为被扩展函数
    /// </summary>
    public class MyMath : IMyMath
    {
        /// <summary>
        /// 加法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public int Add(int x, int y)
        {
            return x + y;
        }
 
        /// <summary>
        /// 乘法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public int Multi(int x, int y)
        {
            return x * y;
        }
    }
}

  此处,我需要实现一个新的运算方法,(x + y) * (x + y)运算,此处可以通过静态扩展方法实现,该静态扩展类MathExtension针对所有实现了IMyMath接口的类都进行了扩展,如下静态扩展方法

using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApp1
{
    /// <summary>
    /// Math静态扩展类
    /// </summary>
    public static class MathExtension
    {
        /// <summary>
        /// 扩展方法,实现(x + y) * (x + y)运算
        /// </summary>
        /// <param name="math">指定的扩展类的实例,静态类不能作为目标类</param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public static int AddMulti(this IMyMath math, int x, int y)
        {
            return (x + y) * (x + y);
        }
    }
}

 在入口函数中分别调用MyMath类和MathExtension中的方法,对于AddMulti方法,可以直接通过MyMath实例调用而不需要实例化MathExtensionusing

using System;
 
namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            IMyMath math = new MyMath();
            int result1 = math.Add(4, 5);
            int result2 = math.Multi(4, 5);
            int result3 = math.AddMulti(4, 5);
            Console.WriteLine("result1:" + result1);
            Console.WriteLine("result2:" + result2);
            Console.WriteLine("result3:" + result3);
            Console.ReadLine();
        }
    }
}

运行结果如下

 

 

微软官方对于扩展方法的使用也有完整的示例说明,可参照一下链接

 扩展方法 - C# 编程指南 | Microsoft Docs

 

posted @ 2022-03-20 15:49  说不出来  阅读(1217)  评论(0编辑  收藏  举报