版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yzy85/article/details/80357707
对于已经编译过的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、注意点
扫描二维码关注公众号,回复:
4817774 查看本文章
实例方法比扩展方法优先级高;
扩展方法调用存在“就近原则”,先调用同一命名空间的,然后才调用其他通过using引入的命名空间中的扩展方法;