当前位置导航:炫浪网>>网络学院>>编程开发>>Visual C#教程

了解C#特性扩展方法

  在我们的编程生涯中我们要使用很多很多类库,这些类库有的是我们自己开发的,我们有她的代码,有的是第三方发布的,我们不仅没有他们的代码,连看的机会都没有。

  作为.net程序员,我们每天都要和BCL(Base Class Linbrary)打交道。无疑,BCL做为一个年轻的框架类库,她是成功的,但是还有一些时候我们还是得写一些”Helper”方法来扩展类库,由于我们不能修改类库的源代码,我们只有写一个个的静态类。虽然在使用上也算方便,但作为追求完美的程序员来说总有些不雅。现在我就碰到这样的事情,前两天奉命写一个从XML文件加载Chart图的设置的方法,从XML加载数据绑定到对象上,这肯定是反射的用武之地了。我经常需要写一些根据对象属性名字来判断这个对象是否有这个属性或者根据属性名获取该属性的值。还是按照平常一样,我很快写了一个PropertyHelper,里面有两个静态方法:HasProperty,GetValueByName。

  PropertyHelper.HasProperty(point, "X"),如此的调用也还过得去,不过在C# 3.0微软为我们提供了扩展方法。现在我们可以直接这样调用了point.HasProperty(“X”);看看我是如何实现这个扩展方法的?

publicstaticclassPropertyExtension
{
    publicstaticobjectGetValueByName(thisobjectself,stringpropertyName)
    {
      if(self==null)
      {
        returnself;
      }
      Typet=self.GetType();
      PropertyInfop=t.GetProperty(propertyName);
      returnp.GetValue(self,null);
    }
}

  我给object类型添加了一个扩展方法,在.net里所有的类都继承自object,那所有的类都默认的拥有这个方法了,真方便,呵呵。

  注意到和普通的静态方法有何差别?在这个方法的第一个参数前面多了一个this关键字。

  扩展方法:

  1 方法所在的类必须是静态的

  2 方法也必须是静态的

  3 方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。

  4 在第一个参数前面还需要有一个this关键字。

  按照上面的步骤写你就得到了一个“扩展方法”,你可以像调用这个类的原生方法那样去调用它:

stringstr="abc";
objectlen=str.GetValueByName("Length");

  好像string类型现在有了GetValueByName这个方法一样,但实际上string并没有这样一个方法。那这又是为什么呢?是我们可爱的编译器在其中做了手脚。为了避开编译器的干扰,我们来直接欣赏MSIL代码:

L_0008:ldstr"Length"
L_000d:callobjectTestLambda.PropertyExtension::GetValueByName(object,string)

  从MSIL中我们可以看出,这段代码编译后和调用静态方法没有任何的差别(从call指令来看,这是在调用一个静态方法)。

  从这里可以知道扩展方法即可以使用实例调用的方式也可以直接使用静态类调用的方式:

str.GetValueByName("Length");
  
PropertyExtension.GetValueByName(str,"Length");

  下面将对扩展方法做一些细节的介绍:

  Visual Studio 2008对扩展方法有智能感知的支持,如下图:

不能不说的C#特性-扩展方法

  在方法的图标上有一个与其他的都不相同,他的突变下面还带有一个蓝色的向下的箭头,这就表明这个方法是一个扩展方法。

  下面是对编写扩展方法要注意的几个原则(当然,仁者见仁、智者见智,这也是一家之言):

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接