C# 类的扩展方法

Posted yu-xiansheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 类的扩展方法相关的知识,希望对你有一定的参考价值。

给类对象增加扩展方法,要注意命名空间,一般要使用原类对象的相同命名空间,还有扩展方法类的修饰符需要使用static。下边举个例子:

namespace System

    /// <summary>
    /// DateTime对象扩展方法
    /// </summary>
    public static class ExtDateTime
    
        /// <summary>
        /// 获取秒数时间戳
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static long ExtSecondsTimestamp(this DateTime dt)
        
            return (long)(dt.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;
        

        /// <summary>
        /// 获取毫秒数时间戳
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static long ExtMillisecondsTimestamp(this DateTime dt)
        
            return (long)(dt.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalMilliseconds;
        

    
DateTime dt = DateTime.Now;
// 使用时间对象的扩展方法获取时间戳
var timestamp = dt.ExtMillisecondsTimestamp();

 

C# this扩展方法

本文导读:扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。

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

C#扩展方法第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

 

C# this扩展方法实例

 

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

 

 
C# 代码   复制
技术分享

技术分享       //必须是静态类才可以添加扩展方法
技术分享       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、给自定义的类型增加一个扩展方法,并增加一个传递的参数

(1)、声明一个Student类,它包含了两个方法StuInfo,getStuInfo

 
 
C# 代码   复制
技术分享

技术分享    public class Student
技术分享    {
技术分享        public string StuInfo()
技术分享        {
技术分享            return "学生基本信息";
技术分享        }
技术分享        public  string getStuInfo(string stuName, string stuNum)
技术分享        {
技术分享       return string.Format("学生信息:\\n" + "姓名:{0} \\n" + "学号:{1}", stuName, stuNum);
技术分享        }
技术分享     }
技术分享

 

(2)、声明一个名为ExtensionStudentInfo的静态类,注意必须为静态

这个类的作用就是包含一些我们想要扩展的方法,在此我们声明两个Student类型的扩展方法,Student类型为我们自定义的类型。

 
 
C# 代码   复制
技术分享

技术分享    public static class ExtensionStudentInfo
技术分享    {
技术分享        //声明扩展方法
技术分享        //要扩展的方法必须是静态的方法,Add有三个参数
技术分享        //this 必须有,string表示我要扩展的类型,stringName表示对象名
技术分享        //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,再增加一个变量即可
技术分享        public static string ExtensionStuInfo(this Student stuName)
技术分享        {
技术分享            return stuName.StuInfo();
技术分享        }
技术分享        //声明扩展方法
技术分享        //要扩展的方法必须是静态的方法,Add有三个参数
技术分享        //this 必须有,string表示我要扩展的类型,stringName表示对象名
技术分享        //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,在此我们增加了两个string类型的参数
技术分享        public static string ExtensionGetStuInfo(this Student student, string stuname, string stunum)
技术分享        {
技术分享            return student.getStuInfo(stuname, stunum)+"\\n读取完毕";
技术分享        }
技术分享    }
技术分享

 

(3)、使用自定义类的扩展方法,注意必须要用对象来调用扩展方法

 
 
C# 代码   复制
技术分享

技术分享        static void Main(string[] args)
技术分享        {
技术分享            Student newstudent = new Student();
技术分享            //要使用对象调用我们的扩展方法
技术分享            string stuinfo = newstudent.ExtensionStuInfo();
技术分享            Console.WriteLine(stuinfo);
技术分享            //要使用对象调用我们的扩展方法
技术分享            string stuinformation = newstudent.ExtensionGetStuInfo("quzijing", "20081766");
技术分享            Console.WriteLine(stuinformation);
技术分享            Console.ReadKey();
技术分享        }
技术分享

 

实例3、为string扩展一个验证邮件类

(1)、扩展方法

 
 
C# 代码   复制
技术分享

技术分享using System;
技术分享
技术分享using System.Collections.Generic;
技术分享
技术分享using System.Linq;
技术分享
技术分享using System.Text;
技术分享
技术分享using System.Text.RegularExpressions;
技术分享
技术分享 
技术分享
技术分享//声明扩展方法的步骤:类必须是static,方法是static,
技术分享
技术分享//第一个参数是被扩展的对象,前面标注this。
技术分享
技术分享//使用扩展方法的时候必须保证扩展方法类已经在当前代码中using
技术分享
技术分享namespace 扩展方法
技术分享
技术分享{
技术分享
技术分享    //扩展方法必须是静态的
技术分享
技术分享    public static class StringHelper
技术分享
技术分享    {
技术分享
技术分享        //扩展方法必须是静态的,第一个参数必须加上this
技术分享
技术分享        public static bool IsEmail(this string _input)
技术分享
技术分享        {
技术分享
技术分享            return Regex.IsMatch(_input, @"^\\[email protected]\\w+\\.\\w+$");
技术分享
技术分享        }
技术分享
技术分享        //带多个参数的扩展方法
技术分享
技术分享        //在原始字符串前后加上指定的字符
技术分享
技术分享        public static string Quot(this string _input, string _quot)
技术分享
技术分享        {
技术分享
技术分享            return _quot + _input + _quot;
技术分享
技术分享        }
技术分享
技术分享    }
技术分享
技术分享}
技术分享

 

(2)、使用方法

 
C# 代码   复制
技术分享

技术分享using System;
技术分享
技术分享using System.Collections.Generic;
技术分享
技术分享using System.Linq;
技术分享
技术分享using System.Text;
技术分享
技术分享namespace 扩展方法
技术分享
技术分享{
技术分享
技术分享    class Program
技术分享
技术分享    {
技术分享
技术分享        static void Main(string[] args)
技术分享
技术分享        {
技术分享
技术分享            string _myEmail = "[email protected]";
技术分享
技术分享            //这里就可以直接使用string类的扩展方法IsEmail了
技术分享
技术分享            Console.WriteLine(_myEmail.IsEmail());
技术分享
技术分享            //调用接收参数的扩展方法
技术分享
技术分享            Console.WriteLine(_myEmail.Quot("!"));
技术分享
技术分享 
技术分享
技术分享            Console.ReadLine();
技术分享
技术分享        }
技术分享
技术分享    }
技术分享
技术分享}
技术分享

以上是关于C# 类的扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

C#可扩展编程之MEF:导出类的方法和属性

TypeScript:相当于 C# 的用于扩展类的通用类型约束?

C# this扩展方法

如何使用 C# 扩展方法

c#基础 继承和接口,扩展类型

《C#高级编程》学习笔记