返回顶部
首页 > 资讯 > 精选 >如何实现C#扩展方法
  • 562
分享到

如何实现C#扩展方法

2023-06-17 23:06:52 562人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关如何实现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#扩展方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何实现C#扩展方法

本文链接: https://lsjlt.com/news/294204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何实现C#扩展方法
    这篇文章将为大家详细讲解有关如何实现C#扩展方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在我们的编程生涯中我们要使用很多很多类库,这些类库有的是我们自己开发的,我们有她的代码,有的是第三方发布的,我...
    99+
    2023-06-17
  • 如何实现C#扩展方法性能测试
    这篇文章给大家分享的是有关如何实现C#扩展方法性能测试的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C#扩展方法性能测试方法三则一共是如下三个方法与string.IsNullOrEmpty(称为“原方法”)比较:...
    99+
    2023-06-17
  • C# 扩展方法详解
    目录先来做一下MCSD试题;总结先来做一下MCSD试题;     答案是C; 题目是问怎么定义扩展方法; 下面来看一下扩展方法; 扩展方法是C# ...
    99+
    2024-04-02
  • Android实现扩展Menu的方法
    本文实例讲述了Android实现扩展Menu的方法。分享给大家供大家参考。具体如下: 1. java代码: package com.tabmenu; import andro...
    99+
    2022-06-06
    方法 Android
  • jQuery如何写扩展方法
    小编给大家分享一下jQuery如何写扩展方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!扩展jQuery对象本身。用来在jQu...
    99+
    2024-04-02
  • C#中泛型类和扩展方法如何使用
    我们经常通过泛型构造函数创建泛型实例,也常调用实例的扩展方法。以下的代码在项目中随处可见: static void Main(string[] args) ...
    99+
    2022-11-13
    C# 泛型类 扩展方法
  • jQuery如何实现扩展功能
    这篇文章将为大家详细讲解有关jQuery如何实现扩展功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。扩展我们需要的功能$.extend({ min: func...
    99+
    2024-04-02
  • VUE如何实现表头扩展
    今天小编给大家分享一下VUE如何实现表头扩展的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。ElementUI2.0的表格的扩...
    99+
    2023-07-04
  • java虚拟扩展方法怎么实现
    这篇文章主要介绍“java虚拟扩展方法怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java虚拟扩展方法怎么实现”文章能帮助大家解决问题。1、Java8允许在界面中实现特定的方法,只需在方法...
    99+
    2023-06-30
  • C# 3.0中扩展方法怎么用
    这篇文章主要介绍了C# 3.0中扩展方法怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Extension Methods 使用扩展方法,使用的时候需要注意的地方C# 3...
    99+
    2023-06-17
  • golang 扩展方法
    Golang是一种近年来兴起的编程语言,由于其高效的并发处理和简洁的语法,越来越多的开发者开始使用Golang。然而,Golang在面向对象编程(OOP)方面缺少一些常见的特性,例如扩展方法(extension method)。在本文中,我...
    99+
    2023-05-18
  • Kafka如何实现水平扩展性
    Kafka 实现水平扩展性的方法主要包括以下几个方面: 分区机制:Kafka 将数据分散存储在多个分区中,每个分区可以在不同的 ...
    99+
    2024-03-12
    Kafka
  • php如何安装imap扩展的方法
    本篇内容介绍了“php如何安装imap扩展”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法:1、安装依赖包;2、在php安装包的“ext/...
    99+
    2023-06-07
  • Kafka的集群扩展性如何实现
    Kafka的集群扩展性可以通过以下几个方法实现: 水平扩展:Kafka集群可以通过添加更多的broker节点来实现水平扩展。新的...
    99+
    2024-04-02
  • 怎么在java中实现虚拟扩展方法
    这期内容当中小编将会给大家带来有关怎么在java中实现虚拟扩展方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2....
    99+
    2023-06-14
  • ASP.NETMVC扩展HtmlHelper方法
    在上一篇文章的最后,列出了一些常见的HtmlHelper的方法,这些都是ASP.NET MVC已经定义好的,如果我们想自己定义一个HtmlHelper方法可以吗?答案是肯定的,那么如...
    99+
    2024-04-02
  • 如何使用 C++ 函数对象扩展 STL 算法?
    可以通过使用函数对象来扩展 stl 算法,函数对象是具有调用运算符 (operator()) 的类或结构。只需要将函数对象作为算法的参数传递即可,例如使用 std::sort 算法排序容...
    99+
    2024-04-25
    stl 函数对象 c++
  • springboot扩展MVC的方法
    springboot扩展MVC 自定义 config -> SpringMvcConfig.java 下边就是扩展springMVC的模板: 第一步:@Configurati...
    99+
    2024-04-02
  • C++如何实现Stack方法
    这篇“C++如何实现Stack方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++如何实现Stack方法”文章吧。sta...
    99+
    2023-07-02
  • 如何实现amazeui验证按钮扩展功能
    这篇文章将为大家详细讲解有关如何实现amazeui验证按钮扩展功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。做一个发送验证码按钮,点击后要60秒之后才能再次点击,利用原有的amazeui样式做的一些扩...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作