面向对象——扩展方法

简介: 面向对象——扩展方法

 C#扩展方法:


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


   2 方法也必须是静态的


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


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


例:


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


       }


   }


   class Program


   {


       static void Main(string[] args)


       {


           string str = "abc";


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


           Console.WriteLine(len.ToString());


       }


}  


输出结果:


3


C#扩展方法使用的原则:


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

扩展方法是一个补丁作用,在一个进程(一个程序集)的范围内,给某个类型临时加上方法。所以扩展方法不能写在嵌套类,应该在程序集的全局区,这个程序集的顶级类中。而且要有二(在static类中,是一个static方法),this是它和一般方法的区别符。

扩展方法当然不能破坏面向对象封装的概念,所以只能访问扩展类的public成员。

有两种使用方法,例:

  public static class ExtendMethod


   {

       public static void Fun(this string s)


       {

           Console.WriteLine(s);


       }


   }


   class Program


   {

       static void Main(string[] args)


       {

           string str = "abc";


           str.Fun();


           ExtendMethod.Fun(str);


       }


}


注意:使用s.Fun();这种形式调用更能体现扩展方法的意味。使用ExtendMethod.fun(s);这种形式调用,则更能体现扩展方法实现的本质,便于理解为什么是只能访问锁扩展类型的public成员。


LINQ的实现正是基于扩展方法,实现原理为:


在一个基类上进行扩展,一般而言扩展方法单独地建立一个命名空间,在使用的时候,导入这个命名空间,则开启了扩展方法的可见性,这个时候,所有子类便可以使用这个扩展方法了(因为子类继承了基类,public,static这样的权限级别更是很容易的满足直接调用)


 class User


   {

       public string Name { get; set; }


       public int Age { get; set; }


       public double Pay { get; set; }


       public override string ToString()


       {

           return string.Format("姓名:{0} 年龄:{1} 工资:{2}", Name, Age, Pay);


       }


   }


   static class ShowInfo


   {

       public static void Display(this object o)


       {

           Console.WriteLine(o.ToString(),"提示!");


       }


   }


   class Program


   {

       static void Main(string[] args)


       {

           Console.WriteLine("使用扩展方法显示员工信息:");


           (new User() { Name = "刘老师", Age = 28, Pay = 3000 }).Display();


       }


}


目录
相关文章
|
10月前
|
Java
java引入本地 MultipartFile 实现多部分文件上传
在Java中,`MultipartFile`通常用于处理通过HTML表单上传的文件。但在某些情况下,需要直接从本地文件系统获取文件并上传。本文介绍如何创建一个实现了`MultipartFile`接口的本地类`LocalMultipartFile`,将本地文件转换为`MultipartFile`对象,简化文件上传流程。此方法适用于批量上传等场景,避免了表单上传的复杂性。代码示例展示了如何实现和使用该类进行文件上传操作。作者:华科云商小彭。链接:[稀土掘金](https://juejin.cn/post/7377559533785530431)。
490 18
|
数据可视化 数据处理 Python
使用Pandas实现Excel中的数据透视表功能
本文介绍了如何使用Python的Pandas库实现Excel中的数据透视表功能,包括环境准备、创建模拟销售数据、代码实现及输出等步骤。通过具体示例展示了按地区和销售员汇总销售额的不同方法,如求和、平均值、最大值等,帮助读者掌握Pandas在数据处理上的强大能力。
422 12
|
消息中间件 存储 关系型数据库
实时计算 Flink版产品使用问题之有哪些方法可以实现整库同步
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
C#
C# 当前上下文中不存在InitializeComponent()
C#——当前上下文中不存在InitializeComponent()可能原因是:项目文件直接由外部加载进来时可能出现错误。可以先检查xaml文件的开头x:Class=“day27test02.MainWindow”是否是正确的类名。如果不是,改成对应的项目的类即可。这是本人碰到的这种情况通过这种方式得到解决的,仅供参考。
988 1
C# 当前上下文中不存在InitializeComponent()
|
自然语言处理 数据可视化 算法
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集1
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
|
消息中间件 数据采集 存储
大数据数据采集的数据采集(收集/聚合)的Flume之数据采集流程的Channel的Kafka Channel
在大数据处理和管理中,数据采集是非常重要的一环。为了更加高效地进行数据采集,Flume作为一种流式数据采集工具得到了广泛的应用。其中,Flume的Channel模块是实现数据缓存和传输的核心模块之一。本文将介绍Flume中的Kafka Channel,讲解其数据采集流程。
362 0
|
人工智能 编解码 UED
CorelDRAW2023中文版下载安装教程
CorelDRAW2023即CDR2023是加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件,可以说是最强大的设计软件,在广告、包装行业使用率非常高,CorelDRAW2023新版发布为广大用户带来了很多新的功能,新版本2023的重新设计了操作页面,可以让您根据自己的工作习惯选择您的工作空间。 如果您习惯使用ps 或 AI,则可以将 CorelDRAW 的新界面设置为与上述软件类似。 新版本还提供了几个用于优化工作流程的新工作区,并支持高分辨率和多显示器,允许您在多个屏幕上移动项目。官方小哥聊软件为大家提供的是CorelDRAW2023中文版版下载,直接安装
1523 2
CorelDRAW2023中文版下载安装教程
|
API TensorFlow 算法框架/工具
MLflow 快速入门
安装 使用一下命令即可安装 MLflow:
|
缓存 Python Perl
python | 正则表达式re库常用方法介绍
python | 正则表达式re库常用方法介绍
378 0

热门文章

最新文章