对于一些现成的类,如果我们想添加一些新的方法来完善功能,但是不想改变已有的封装,也不想使用派生类,那么该怎么办呢?这里我们可以使用扩展方法。
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
我们首先来看个例子,有个直观的认识。一个现有的类User:
public class User
{
string _name;
public User(string Name)
{
_name = Name;
}
public string Name
{
get { return _name; }
set { this._name = value; }
}
}
现在我们想要增加一个方法来显示user信息,又不想修改User类。使用扩展方法
扩展方法是一种比较特殊的使用,我们可以定义静态方法,然后在目标类型中以实例方法的语法进行调用。有了上面的定义后,当使用User实例时,会产生相应的智能感知,而且会提示是扩展方法。
调用结果
User user = null;//实例为null
user.DisplayName();
user = new User("小静");//实例不为Null
user.DisplayName();
Console.Read();
查看ILDASM.exe,我们看到定义扩展方法后,Extension类会添加一个ExtensionAttribute标记。
怎样定义扩展方法?
编译过程识别顺序?
在上面的例子中,调用语句为user.DisplayName();,那么编译器的检查过程:
此时,我们不能再用实例方法的语法来调用了,只能用静态方法语法调用。
user = new User("小静");//实例不为Null
Extension.DisplayName(user);
Extension1.DisplayName(user);
public class Student:User{}
它的智能感知,也包含了User类的扩展方法。
所以在定义扩展方法时要比较注意,不能过多使用。基类中使用过多的扩展方法后,也许会使派生类中产生一些多余的智能感知。
User user = null;//实例为null
user.DisplayName();
实例方法调用时,对象不能为null,会产生运行时错误。
扩展方法实际上是调用静态方法,所以调用它的实例对象可以为Null。
除了为类型扩展方法外,还可以为接口定义扩展方法。例如
调用过程:
new[] { "AA", "BBB", "CCCC" }.ShowItems();
"Cathy".ShowItems();
Console.Read();
这篇对扩展方法的介绍到这里算是happy ending了吧。其实说起这个话题,鹤冲天 兄台的研究就深入多了。我就当是抛砖引玉了,大家有兴趣的话学习他的系列c# 扩展方法奇思妙用
扩展方法好资料:
http://msdn.microsoft.com/zh-cn/library/bb383977.aspx
http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html
文章出处:跟小静读CLR via C#
CLR via C#(09)-扩展方法,布布扣,bubuko.com
原文:http://www.cnblogs.com/fireshadow23/p/3640833.html