C#扩展方法详细描述

开发 后端
这里介绍C#扩展方法,不过在C# 3.0微软为我们提供了C#扩展方法。现在我们可以直接这样调用了point.HasProperty(“X”);看看我是如何实现这个C#扩展方法的?
C#语言有很多值得学习的地方,这里我们主要介绍C#扩展方法,包括介绍好像string类型现在有了GetValueByName这个方法一样,但实际上string并没有这样一个方法等方面。

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

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

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

  1. public static class PropertyExtension  
  2. {  
  3. public static object GetValueByName(this object self, string propertyName)  
  4. {  
  5. if (self == null)  
  6. {  
  7. return self ;  
  8. }  
  9. Type t = self.GetType();  
  10. PropertyInfo p = t.GetProperty(propertyName);  
  11. return p.GetValue(self, null);  
  12. }  

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

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

C#扩展方法:

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

2 方法也必须是静态的

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

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

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

  1. string str = "abc";  
  2. object len = str.GetValueByName("Length"); 

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

  1. L_0008: ldstr "Length"  
  2. L_000d: call object TestLambda.PropertyExtension::GetValueByName(object, string) 

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

C#扩展方法有就近原则,也就是如果在你的程序里有两个一模一样的C#扩展方法,一个和你的使用类是处于同一命名空间里,另外一个处于别的命名空间里,这个时候会优先使用同一命名空间里的C#扩展方法,也就是说“血缘关系”越近,越被青睐。

很多人看到C#扩展方法也许眼里冒出金光,以后在设计的时候不管三七二十一,反正可以扩展。还有一些人会对类任意扩展,将以前一些作为”Helper”的方法统统使用C#扩展方法代替,注意的是C#扩展方法有“污染性”,所以我觉得在扩展的时候还是想想,是不是值得这样扩展。

在扩展的时候也不要对比较高层的类进行扩展,像我上面对object的扩展我觉得就是不可取的,object是所有类的基类,一经扩展,所有的类都被“污染”了。

【编辑推荐】

  1. C# lock关键字叙述
  2. C#.Net FrameWork简介
  3. C# new和override简单描述
  4. C#值类型和引用类型浅谈
  5. C#标识符简单分析
责任编辑:佚名 来源: cnblogs
相关推荐

2009-08-27 15:17:40

C# const变量

2009-09-07 15:15:43

2009-08-10 16:40:03

C#索引器

2009-09-03 17:59:18

C#调用事件

2009-10-15 15:04:42

VB.NET PadL

2009-09-24 16:19:53

Hibernate应用

2009-09-25 14:28:40

Hibernate S

2009-09-14 16:33:55

LINQ To XML

2009-09-14 14:58:52

LINQ to XML

2009-09-14 13:14:49

LINQ序列

2010-02-05 16:58:18

Android服务

2009-11-18 11:14:49

2009-10-10 10:04:50

RHEL合法使用

2009-09-08 11:09:39

LINQ数据源

2009-09-25 11:04:32

Hibernate3实

2010-04-09 17:45:06

Oracle索引

2009-10-15 14:59:45

网络布线光纤技术

2011-11-02 09:29:42

存储虚拟化虚拟化

2010-09-08 15:10:48

2009-10-12 12:54:58

VB.NET声明API
点赞
收藏

51CTO技术栈公众号