• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#特性 扩展方法

C#特性 扩展方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#特性,c#特性有什么用,c#特性的作用,c#继承的特性,c#6.0新特性等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

作为.net程序员,我们每天都要和BCL(Base Class Linbrary)打交道。无疑,BCL做为一个年轻的框架类库,她是成功的,但是还有一些时候我们还是得写一些”Helper”方法来扩展类库,由于我们不能修改类库的源代码,我们只有写一个个的静态类。虽然在使用上也算方便,但作为追求完美的程序员来说总有些不雅。


现在我就碰到这样的事情,前两天奉命写一个从XML文件加载Chart图的设置的方法,从XML加载数据绑定到对象上,这肯定是反射的用武之地了。我经常需要写一些根据对象属性名字来判断这个对象是否有这个属性或者根据属性名获取该属性的值。还是按照平常一样,我很快写了一个PropertyHelper,里面有两个静态方法:HasProperty,GetValueByName。


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

public static class PropertyExtension
{
    public static object GetValueByName(this object self, string propertyName)
    {
      if (self == null)
      {
        return self ;
      }
      Type t = self.GetType();
      PropertyInfo p = t.GetProperty(propertyName);
      return p.GetValue(self, null);
    }
}
</div>

我给object类型添加了一个扩展方法,在.net里所有的类都继承自object,那所有的类都默认的拥有这个方法了,真方便,呵呵。
注意到和普通的静态方法有何差别?在这个方法的第一个参数前面多了一个this关键字。

扩展方法:

1、方法所在的类必须是静态的
2、方法也必须是静态的
3、方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。
4、在第一个参数前面还需要有一个this关键字。

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

string str = "abc";
object len = str.GetValueByName("Length");
</div>

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

L_0008: ldstr "Length"
L_000d: call object TestLambda.PropertyExtension::GetValueByName(object, string)
</div>

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

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

str.GetValueByName("Length");
PropertyExtension.GetValueByName(str,"Length");
</div>

下面将对扩展方法做一些细节的介绍:
Visual Studio 2008对扩展方法有智能感知的支持,如下图

在方法的图标上有一个与其他的都不相同,他的突变下面还带有一个蓝色的向下的箭头,这就表明这个方法是一个扩展方法。
下面是对编写扩展方法要注意的几个原则(当然,仁者见仁、智者见智,这也是一家之言):

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


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


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

发表与2008-07-16
于2008-08-06第一次更新

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C# 6.0 新特性汇总
  • C#开发教程之利用特性自定义数据导出到Excel
  • 探秘C# 6.0 的新特性
  • C#特性 扩展方法
  • C#特性-对象集合初始化器介绍
  • C#4.0新特性之协变与逆变实例分析
  • C#属性(Attribute)用法实例解析
  • 通过特性(attribute)为枚举添加更多信息示例

相关文章

  • 2017-05-28浅谈C# 中的委托和事件
  • 2017-05-28详解C#中委托,事件与回调函数讲解
  • 2017-05-28DevExpress实现GridControl同步列头checkbox与列中checkbox状态
  • 2017-05-28C# 连接SQL数据库的方法及常用连接字符串
  • 2017-05-28C#判断字符串是否是int/double(实例)
  • 2017-05-28如何搭建新的WPF项目框架
  • 2017-05-28C#实现文件断点续传下载的方法
  • 2017-05-28C#定时器和随机数
  • 2017-05-28C#最简单的关闭子窗体更新父窗体的实现方法
  • 2017-05-28c#制作类似qq安装程序一样的单文件程序安装包

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • WPF字体或内容模糊的解决方法
    • c# Base关键字的使用
    • 微信开放平台之网站授权微信登录功能
    • C#实现在控制台输入密码显示星号的方法
    • 使用VS2010 C#开发ActiveX控件(下),完整代码打包下载
    • C#下listview如何插入图片
    • 使用C#实现RTP数据包传输 参照RFC3550
    • c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)
    • c#扩展datatable转json示例
    • C#图形区域剪切的实现方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有