这篇谈谈扩展方法,顾名思义,扩展即对某一个事物进行增加,或者增加一些功能。那扩展方法呢?比如我们现在有一个类A,但是这个类就标记成了sealed,我们不能继承这个类,又或者我们现在手上有一个dll,可以是买来的,可以是任何途径你得到的,但是你发现这个dll中有一个些类的功能并不是你想要的,或者没有你想要的,但是你却加不了任何方法。这个时候就可以用扩展方法。扩展方法即扩展我们想要扩展功能但却不能继承,不能修改源代码的类。
首先,扩展framerwork的string类,因为string类是sealed类
首先是扩展类
namespace ExtensionMethod
{
public static class ExtensionString
{
public static void Extension(this string s)
{
Console.WriteLine("String is Extensioned");
}
}
}
扩展类是静态的,扩展方法也是静态的,方法的参数名称是要扩展的类型,为了区分参数,和扩展的类型,必须在要扩展的类型前加this关键字。
调用代码
static void Main(string[] args)
{
string s = "Hello World";
s.Extension();
Console.Read();
}
下面我们在扩展类里面加上一个重载方法
public static class ExtensionString
{
public static void Extension(this string s)
{
Console.WriteLine("String is Extensioned");
}
public static void Extension(this string s, string name)
{
Console.WriteLine("Hello:"+name);
}
}
加上一个有参数的,name。
调用代码
static void Main(string[] args)
{
string s = "Hello World";
s.Extension();
s.Extension("Edrick");
Console.Read();
}
下面我们看看扩展方法在我们无法获取源代码的dll类中的扩展
新建项目,新建类Person,类里面没有任何代码
namespace Edrick.Liu.People
{
public class Perosn
{
}
}
添加引用,添加我们来是扩展类
namespace ExtensionMethod
{
public static class PersonExtension
{
public static void PrPerson(this Perosn p, string firstName,string lastName)
{
Console.WriteLine(firstName+","+lastName);
}
}
}
调用类
class Program
{
static void Main(string[] args)
{
//string s = "Hello World";
//s.Extension();
//s.Extension("Edrick");
Perosn p = new Perosn();
p.PrPerson("Edrick", "Liu");
Console.Read();
}
}
我们新建一个类Student继承Person,
namespace ExtensionMethod
{
public class Student:Perosn
{
public Student()
{
}
}
}
我们在调用Student的时候可以访问到Person的扩展方法
static void Main(string[] args)
{
//string s = "Hello World";
////s.Extension();
////s.Extension("Edrick");
//ExtensionString.Extension(s);
//Perosn p = new Perosn();
//p.PrPerson("Edrick", "Liu");
//Console.Read();
Student student = new Student();
student.PrPerson("Edrick", "Liu");
Console.Read();
}
说明子类可以访问到父类的扩展方法。
个人对扩展方法的建议
1,它反应不了类的真实意图,即一个类想要完成的某个对象功能被拆散分布在多个类文件中,我们在调用扩展类的时候其实是调用的静态类,只是把扩展的类型当做参数传入静态方法中ExtensionString.Extension(s);但是我们本想string完成的功能却在扩展类的代码中。所以,我们在想扩展密封类的时候扩展方法可以起到很好的作用,但是如果类可以继承,个人觉得最好还是继承类。
2,在维护性会有一定的影响,但是不大。