我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何实现C#扩展方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何实现C#扩展方法

这篇文章将为大家详细讲解有关如何实现C#扩展方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

作为.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#扩展方法的?

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);  }  }

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

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

C#扩展方法:

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

2 方法也必须是静态的

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

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

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

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

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

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

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

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

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

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

关于“如何实现C#扩展方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何实现C#扩展方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何实现C#扩展方法

这篇文章将为大家详细讲解有关如何实现C#扩展方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在我们的编程生涯中我们要使用很多很多类库,这些类库有的是我们自己开发的,我们有她的代码,有的是第三方发布的,我
2023-06-17

如何实现C#扩展方法性能测试

这篇文章给大家分享的是有关如何实现C#扩展方法性能测试的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C#扩展方法性能测试方法三则一共是如下三个方法与string.IsNullOrEmpty(称为“原方法”)比较:
2023-06-17

Android实现扩展Menu的方法

本文实例讲述了Android实现扩展Menu的方法。分享给大家供大家参考。具体如下: 1. java代码:package com.tabmenu; import android.content.Context; import android
2022-06-06

C#中泛型类和扩展方法如何使用

这篇文章介绍了C#中泛型类和扩展方法的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

VUE如何实现表头扩展

今天小编给大家分享一下VUE如何实现表头扩展的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。ElementUI2.0的表格的扩
2023-07-04

java虚拟扩展方法怎么实现

这篇文章主要介绍“java虚拟扩展方法怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java虚拟扩展方法怎么实现”文章能帮助大家解决问题。1、Java8允许在界面中实现特定的方法,只需在方法
2023-06-30

C# 3.0中扩展方法怎么用

这篇文章主要介绍了C# 3.0中扩展方法怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Extension Methods 使用扩展方法,使用的时候需要注意的地方1.C#
2023-06-17

Kafka如何实现水平扩展性

Kafka 实现水平扩展性的方法主要包括以下几个方面:分区机制:Kafka 将数据分散存储在多个分区中,每个分区可以在不同的 broker 上进行复制,从而实现数据的水平扩展。通过将数据进行分区,可以将数据分布在多个节点上,提高了系统的吞吐
Kafka如何实现水平扩展性
2024-03-12

php如何安装imap扩展的方法

本篇内容介绍了“php如何安装imap扩展”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法:1、安装依赖包;2、在php安装包的“ext/
2023-06-07

怎么在java中实现虚拟扩展方法

这期内容当中小编将会给大家带来有关怎么在java中实现虚拟扩展方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2.
2023-06-14

如何使用 C++ 函数对象扩展 STL 算法?

可以通过使用函数对象来扩展 stl 算法,函数对象是具有调用运算符 (operator()) 的类或结构。只需要将函数对象作为算法的参数传递即可,例如使用 std::sort 算法排序容器时,可以传递 std::greater 函数对象作为
如何使用 C++ 函数对象扩展 STL 算法?
2024-04-25

C++如何实现Stack方法

这篇“C++如何实现Stack方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++如何实现Stack方法”文章吧。sta
2023-07-02

如何实现amazeui验证按钮扩展功能

这篇文章将为大家详细讲解有关如何实现amazeui验证按钮扩展功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。做一个发送验证码按钮,点击后要60秒之后才能再次点击,利用原有的amazeui样式做的一些扩
2023-06-09

PHP如何实现rar解压读取扩展包

这篇文章给大家分享的是有关PHP如何实现rar解压读取扩展包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者。rar 格
2023-06-15

如何使用模板Editor ViewPort Adornment实现扩展

今天小编给大家分享一下如何使用模板Editor ViewPort Adornment实现扩展的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录