c#中的扩展方法

扩展声明

扩展方法它可以让我们在不修改原始类的情况下,为其添加新的方法。

并不是任何方法都能作为扩展方法使用 , 必须具有以下特征:
它必须在一个非嵌套的、非泛型的静态类中(所以必须是一个静态方法)

至少要有一个参数;

  • 第一个参数必须是要扩展的类型,使用this关键字进行标记
  • 第一个参数不能有其他任何修饰符(比如out或ref);
  • 第一个参数的类型不能是指针类型。

注意事项

注意的地方:

  1. 扩展方法不能和调用的方法放到同一个类中
  2. 第一个参数必须要,并且必须是this,这是扩展方法的标识,可以在后面追加参数。
  3. 最好保证扩展方法和调用方法在同一个命名空间下

实例1

给string 类型增加一个Add方法,该方法的作用是给字符串增加一个字母a

       //必须是静态类才可以添加扩展方法
       Static class Program
       {
        static void Main(string[] args)
        {
            string str = "quzijing";
            //注意调用扩展方法,必须用对象来调用 
            string Newstr = str.Add();
            Console.WriteLine(Newstr);
            Console.ReadKey();
        }
        //声明扩展方法
        //扩展方法必须是静态的,Add有三个参数
        //this 必须有,string表示我要扩展的类型,stringName表示对象名
        //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,//再增加一个变量即可

        public static  string  Add(this string stringName)
        {
            return stringName+"a";
        }
}

实例2

使用对象的扩展方法

 public class Person
 {
   public string Name
   {
     set;
     get;
   }
   public int Age
   {
     set;
     get;
   }
 }
//必须是静态类才可以添加扩展方法
//Person的扩展方法,根据年龄判断是否是成年人
public static bool GetBIsChild(this Person oPerson)
{
  if(oPerson.Age >= 18) return false;
  else return true;
}

Main方法里面调用:

var oPerson1 = new Person();
oPerson1.Age = 20;
var bIsChild = oPerson1.GetBIsChild();        

实例3

泛型对象的扩展

public static class DataContractExtensions
{
  //必须是静态类才可以添加扩展方法
  //测试方法
  public static T Test < T > (this T instance) where T: Test2
  {
    T Res =
      default(T);
    try
    {
      Res.AttrTest = instance.AttrTest.Substring(0, 2);
      //其他复杂逻辑...
    }
    catch
    {}
    return Res;
  }
}
public class Test2
{  
  public string AttrTest
  {
    set;
    get;
  }
}

实例4

集合扩展方法

 public static void ShowItems < T > (this IEnumerable < T > _al)
 {
   foreach(var item in _al)
   {
     Console.WriteLine(item);
   }
 }
 static void Main(string[] args)
 {
   //调用集合的扩展方法
   str.ShowItems < char > ();
 }
posted @ 2020-10-27 16:32  少年。  阅读(229)  评论(0编辑  收藏  举报