使用大杂烩框架AppFuse快速开发Web程序
三、C# 3.0中如何解决Type的扩展性
理解了我们的具体需要和现有编程语言的局限性后,我们来看看C# 3.0中是如何通过Extension Method解决这个问题的。
简单地说Extension Method是一个定义在Static Class的一个特殊的Static Method。之所以说这个Static Method特别,是因为Extension Method不但能按照Static Method的语法进行调用,还能按照Instance Method的语法进行调用。
我们还是先来看例子,首先是我们需要进行扩展的Vector Type的定义:
通过上面的介绍,我们知道在C# 3.0如何通过定义Extension Method在不对Type作任何修改的前提下对Type进行扩展。
理解了我们的具体需要和现有编程语言的局限性后,我们来看看C# 3.0中是如何通过Extension Method解决这个问题的。
简单地说Extension Method是一个定义在Static Class的一个特殊的Static Method。之所以说这个Static Method特别,是因为Extension Method不但能按照Static Method的语法进行调用,还能按照Instance Method的语法进行调用。
我们还是先来看例子,首先是我们需要进行扩展的Vector Type的定义:
在不对Vector Class的定义进行更新的前提下,我们把需要添加的Adds方法定义在一个Static Class中:public class Vector { private double _x; private double _y; public double X { get {return this._x;} set { this._x = value;} } public double Y { get { return this._y;} set {this._y = value;} } }
这个Extension Method:Adds是一个Static方法。和一般的Static方法不同的是:在第一个参数前添加了一个this 关键字。这是在C# 3.0中定义Extension Method而引入的关键字。添加了这样一个关键字就意味着在调用该方法的时候这个标记有this的参数可以前置,从而允许我们向调用一般Instance Method的方式来调用这个Static Method。比如:public static class Extension { public static Vector Adds(this Vector p,Vector p1) { return new Vector { X = p.X + p1.X, Y = p.Y + p1.Y }; } }
注:this关键字只能用于标记第一个参数。class Program { static void Main(string[] args) { var v = new Vector { X = 1, Y = 2 }; v = v.Adds(v); Console.WriteLine("v.X = {0} and v.Y = {1}", v.X, v.Y); } }
通过上面的介绍,我们知道在C# 3.0如何通过定义Extension Method在不对Type作任何修改的前提下对Type进行扩展。
0
相关文章