zoukankan      html  css  js  c++  java
  • C# 扩展方法

      有许多扩展类的方式。如果有类的源代码,继承就是给对象添加功能的好方法。但是如果没有源代码,该肿么办呢?此时可以使用扩展方法,它允许改变一个类,但不需要该类的源代码。

      扩展方法是静态方法,它是类的一部分,但实际上没有放在类的源代码中。假定下面Demo中的Money类需要一个方法AddToAmount(decimal amountToAdd)。但是,由于某种原因,程序集最初的源代码不能直接修改。此时必须做的工作就是创建一个静态类,把方法AddToAmount()添加为一个静态方法。

     public static class MoneyExtension
        {
            public static void AddToAmount(this Money money, decimal amountToAdd)
            {
                money.Amount += amountToAdd;
            }
        }

    注意AddToAmount()方法的参数。对于扩展方法,第一个参数是要扩展的类型,它放在this关键字的后面。这告诉编译器,这个方法是Money类型的一部分。在这个Demo中,Money是要扩展的类型。在扩展方法中,可以访问所扩展类型的所有公有方法和属性。

      在主程序中,AddToAmount()方法看起来像是另一个方法。它没有显示第一个参数,也不能对它进行任何处理。要使用新方法,需要执行如下调用,这与其他方法相同:

    cash1.AddToAmount(10M);

      即使扩展方法是静态的,也要使用标准的实例方法语法。注意这里使用cash1是咧变量来调用AddToAmount,而没有使用类型名。

      如果扩展方法与类中的某个方法同名,就从来不会调用扩展方法。类中已有的任何实例方法优先。

      完整Demo如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 扩展方法
    {
        class Program
        {
            static void Main(string[] args)
            {
                Money cash1 = new Money();
                cash1.Amount = 40M;
                Console.WriteLine("cash1.ToSting() returns:" + cash1.ToString());
    
                cash1.AddToAmount(10M);
                Console.WriteLine("MoneyExtension function:" + cash1.ToString());
                Console.ReadLine();
            } 
        }
    
        public class Money
        {
            private decimal amount;
    
            public decimal Amount
            {
                get { return amount; }
                set { amount = value; }
            }
    
            public override string ToString()
            {
                return "$" + Amount.ToString();
            }
        }
    
        public static class MoneyExtension
        {
            public static void AddToAmount(this Money money, decimal amountToAdd)
            {
                money.Amount += amountToAdd;
            }
        }
    }

  • 相关阅读:
    行为模式
    行为模式
    行为模式
    行为模式
    行为模式
    结构模式
    kafka 学习整理
    Hive文件格式,以及ORC创建使用
    GBDT 介绍
    机器学习中的特征工程 —— 七月在线总结
  • 原文地址:https://www.cnblogs.com/GerryGe/p/4778463.html
Copyright © 2011-2022 走看看