C# 扩展方法初步学习及使用及深度拷贝方法

对于已经编译过的dll类或者已有类但是不允许修改该类原始类型的情况下,如果我们想对其增加新方法,可以通过继承父类,添加子类,增加新方法,也可以通过为该dll类添加扩展方法实现增加新方法。在C# 3.0中出现了扩展方法,通过扩展方法我们可以直接在一个现有的类型上"添加"方法。当使用扩展方法的时候,可以像调用实例方法一样的方式来调用扩展方法。、

1、扩展方法声明

  • 它必须在一个非嵌套、非泛型的静态类中(所以扩展方法一定是静态方法)
  • 它至少要有一个参数
  • 第一个参数必须加上this关键字作为前缀,表示该参数是要调用该方法的对象。
    • 第一个参数类型也称为扩展类型(extended type),表示该方法对这个类型进行扩展
  • 第一个参数不能用其他任何修饰符(比如out或ref)

  • 第一个参数的类型不能是指针类型

下面是一个利用二进制序列化对实体对象深度复制的扩展方法,可以看出,扩展方法是在一个静态类中实现的静态方法,该方法至少需要一个参数作为调用该方法的对象:

注:调用该扩展方法的对象类型需要添加序列化标签[Serializable]

using System;
using System.Text;
using System.Data;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;

namespace Extentions
{
    public static class ExtentionMethods
    {
        public static T CopyObject<T>(this object objSource)
        {
            if (!typeof(T).IsSerializable)
            {
                throw new ArgumentException("对象类型必须可序列化[serializable]", "source");
            }

            // Don't serialize a null object, simply return the default for that object
            if (Object.ReferenceEquals(objSource, null))
            {
                return default(T);
            }

            IFormatter formatter = new BinaryFormatter();
            Stream stream = new MemoryStream();
            using (stream)
            {
                formatter.Serialize(stream, objSource);
                stream.Seek(0, SeekOrigin.Begin);
                return (T)formatter.Deserialize(stream);
            }
        }
    }
}

2、扩展方法调用

首先要调用扩展方法,首先要引用该扩展方法的命名空间,然后才能在对象调用的时候正常运行。

2.1 通过实体对象调用扩展方法:

Student stu1 = new Student();
Student stu2 = stu1.CopyObject<Studeng>();

2.2 通过静态类名.静态方法调用扩展方法

Student stu1 = new Student();
Student stu2 = Student.CopyObject<Studeng>(stu1);

3、注意点

实例方法比扩展方法优先级高;

扩展方法调用存在“就近原则”,先调用同一命名空间的,然后才调用其他通过using引入的命名空间中的扩展方法;





©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页