C#知识点-15(匿名函数、使用委托进行窗体传值、反射)

匿名函数

概念:没有名字的函数,一般情况下只调用一次。它的本质就是一个方法,虽然我们没有定义这个方法,但是编译器会把匿名函数编译成一个方法

    public delegate void Del1();//无参数无返回值的委托public delegate void Del2(string name);//有参数无返回值的委托public delegate string Del3(string s,int n);//有参数有返回值的委托internal class Program{static void Main(string[] args){Del1 del1 = delegate (){Console.WriteLine("无参数无返回值的匿名函数");};del1.Invoke();Console.ReadKey();}}

我们可以使用lambda表达式更简洁地定义一个匿名函数

            Del1 del1 = () => { Console.WriteLine("无参数无返回值的lambda表达式"); };del1.Invoke();//调用Console.ReadKey();

当lambda表达式中参数列表只有一个参数时,括号可以省略

            Del2 del2 = msg => { Console.WriteLine("hello" + msg); };del2.Invoke("world" + "有参数无返回值的lambda表达式");Console.ReadKey();

匿名函数定义的参数列表的参数类型,是不能省略的

            Del3 dle3 = (string s1, int n1) => { return "有参数有返回值的lambda表达式"; };string res = dle3.Invoke("1", 1);Console.WriteLine(res);

泛型委托

之前我们写的委托都是需要自己定义委托的参数和返回值,而.NET框架为我们封装了泛型委托框架,让我们不用再声明委托,可以直接使用。分别为Action委托,Func委托。

Action委托:
不带返回值的委托,可以有参数,也可以没有参数

            Action action = () => { Console.WriteLine("无参无返回值的委托"); };action();//直接调用action.Invoke();//间接调用Action<string,int> action2 = (a,b)=> { Console.WriteLine("姓名为{0}的人,年龄为{1}",a,b); };action2.Invoke("张三",18);Console.ReadKey();

Func委托:
带返回值的委托

//如果Func尖括号里只有一个参数类型,就表示返回值就是这个类型Func<int> func = () => { return 100; };int a = func.Invoke();Console.WriteLine(a);//需要两个整数类型的参数,以及一个string类型的返回值Func<int, int, string> func2 = (c, d) => { Console.WriteLine(c); Console.WriteLine(d); return "hello world"; };string res = func2.Invoke(10, 20);Console.WriteLine(res);

使用委托进行窗体传值

1、先创建两个窗体对象,添加所需控件


2、当点击form1按钮时,将textbox里的值传递给form2
 

namespace 委托_窗体传值
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//创建一个form2对象,通过form2的构造函数将窗体1的文本框的值传递给窗体2Form2 form2 = new Form2(textBox1.Text.Trim());//将窗体2展示出来form2.Show();}}
}
namespace 委托_窗体传值
{public partial class Form2 : Form{public Form2(string msg)//窗体2的构造函数,每回创建窗体2对象的时候都会执行构造函数初始化。通过参数接收窗体一传递过来的值{InitializeComponent();textBox1.Text = msg;//将接收到的值展示到窗体2的文本框上}private void button1_Click(object sender, EventArgs e){}}
}

3、当点击form2的按钮时,将窗体2中的值传递给窗体1
 

    public partial class Form2 : Form{string _msg;//字段存储窗体二收到的消息Action<string> _action;public Form2(string msg,Action<string> action)//窗体2的构造函数,每回创建窗体2对象的时候都会执行构造函数初始化。通过参数接收窗体一传递过来的值{InitializeComponent();//textBox1.Text = msg;//将接收到的值展示到窗体2的文本框上this._msg = msg;this._action = action;}private void button1_Click(object sender, EventArgs e){//调用ShowMsg,将值传递给窗体1this._action.Invoke(textBox1.Text.Trim());}private void Form2_Load(object sender, EventArgs e){//窗体加载的时候,把数据赋值给文本框textBox1.Text = this._msg;}}
namespace 委托_窗体传值
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//创建一个form2对象,通过form2的构造函数将窗体1的文本框的值传递给窗体2Form2 form2 = new Form2(textBox1.Text.Trim(),ShowMsg);//将窗体2展示出来form2.Show();}void ShowMsg(string msg){textBox1.Text = msg;}}
}

多播委托

概念:让一个委托对象,指向多个方法

    internal class Program{public delegate void Del();static void Main(string[] args){Del del = M1;del += M2;del += M3;del += M4;del -= M5;del.Invoke();Console.ReadKey();}static void M1(){Console.WriteLine("我是M1");}static void M2(){Console.WriteLine("我是M2");}static void M3(){Console.WriteLine("我是M3");}static void M4(){Console.WriteLine("我是M4");}static void M5(){Console.WriteLine("我是M5");}}

运行结果

反射

概念:反射就是动态获取程序集中的元数据(提供程序集的类型信息)的功能

    internal class Program{static void Main(string[] args){//Type//获取类型的类型:元数据//获取类型的Type有两种方式//1、创建了Person对象//Person p = new Person();//Type type = p.GetType();//2、没有创建Person对象Type type = typeof(Person);  //typeof后面放的是数据类型,不能放对象//GetMembers()获取type反射出来所有的类型中的公共成员MemberInfo[] mi = type.GetMembers(BindingFlags.Instance|BindingFlags.NonPublic);foreach (var item in mi){Console.WriteLine(item.Name);}Console.ReadKey();}}class Person{public Person(){}private string _name;public int Age { get; set; }public void SayHi(){Console.WriteLine("实例方法");}public static void StaticSayHi(){Console.WriteLine("静态方法");}public Person(string name, int age){this._name = name;this.Age = age;}public Person(int age){this.Age = age;}}

反射程序集中的元数据

    internal class Program{static void Main(string[] args){//1、先获取要反射数据的程序集//注意:就把ass这个程序集对象,当成是DLL类库Assembly ass = Assembly.LoadFile(@"C:\Users\ThinkPad\source\repos\DLL_Test\bin\Debug\DLL_Test.dll");//2、获取程序集中定义的数据类型/成员 GetTypes获取的成员包括public和internal修饰的//Type[] types = ass.GetTypes();//GetExportedTypes();获取所有被public修饰的成员//Type[] types = ass.GetExportedTypes();//foreach (var item in types)//{//    Console.WriteLine(item.Name);//}//GetType():在类型的名字前面,必须加上命名空间Type type = ass.GetType("DLL_Test.Person");//class:类//Method:方法//field:字段//Property:属性//Instance:实例的//static:静态的//Assembly:程序集//Type:类型//Exported:公开的//Member:成员//Parameter:参数//Constructor:构造函数//GetMembers()获取类型中定义的所有公开成员//MemberInfo[] mi = type.GetMembers(BindingFlags.Instance | BindingFlags.NonPublic);//foreach (var item in mi)//{//    Console.WriteLine(item.Name);//}//3、获取类型中定义的所有的方法//MethodInfo[] mi = type.GetMethods();//foreach (var item in mi)//{//    Console.WriteLine(item.Name);//    //Console.WriteLine(item.ReturnParameter.Name);//    Console.WriteLine(item.ReturnType); //获取返回值的类型//    Console.WriteLine("==============================");//}4、获取类型中定义的所有构造函数//ConstructorInfo[] ci = type.GetConstructors();//foreach (var item in ci)//{//    Console.WriteLine(item.Name);//    ParameterInfo[] pi = item.GetParameters();//    foreach (var item2 in pi)//    {//        Console.WriteLine(item2.Name);//        //获取参数类型//        Console.WriteLine(item2.ParameterType);//        Console.WriteLine("==============================================");//    }//}//5、获取数据类型中定义的所有属性//PropertyInfo[] pi = type.GetProperties();//foreach (var item in pi)//{//    Console.WriteLine(item.Name);//}//6、获取数据类型中定义的所有字段//FieldInfo[] fi = type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic);//foreach (var item in fi)//{//    Console.WriteLine(item.Name);//}//7、调用静态方法//MethodInfo[] mi = type.GetMethods(BindingFlags.Static | BindingFlags.Public); //foreach (var item in mi)//{//    Console.WriteLine(item);//}//MethodInfo mi = type.GetMethod("StaticSayHi");调用参数1:表示实例对象,调用静态方法,可以不提供,给null值即可。参数2:表示方法的参数,必须以object数组的形式提供。//object res = mi.Invoke(null, new object[] { "world" });//Console.WriteLine(res);8、调用实例方法//MethodInfo mi = type.GetMethod("InstanceSayHi");动态的创建对象 CreateInstance帮我们执行构造函数,创建对象//object o = Activator.CreateInstance(type);//mi.Invoke(o, null);//9、调用重载方法 new Type[] { typeof(int), typeof(int) } 来匹配重载//MethodInfo mi = type.GetMethod("Add", new Type[] { typeof(int), typeof(int) });//object o = Activator.CreateInstance(type);//object res = mi.Invoke(o, new object[] { 1,1 });//Console.WriteLine(res);//10、调用构造函数ConstructorInfo ci = type.GetConstructor(new Type[] { });object o = ci.Invoke(null);Console.ReadKey();}}

反射相关的补充方法

    internal class Program{static void Main(string[] args){//IsAssignableFrom: 后面的是否可以赋值给前面的//特点:既可以判断类,也可以判断接口//bool b = typeof(Person).IsAssignableFrom(typeof(Teacher));//bool b2 = typeof(I1).IsAssignableFrom(typeof(Teacher));//IsInstanceOfType:后面的对象,是否可以赋值给前面的类型Person p = new Person();Student s = new Student();Teacher t = new Teacher();//bool b3 = typeof(Person).IsInstanceOfType(p);//bool b4 = typeof(Person).IsInstanceOfType(s);//bool b5 = typeof(Person).IsInstanceOfType(t);//bool b6 = typeof(I2).IsInstanceOfType(t);//Console.WriteLine(b3);//Console.WriteLine(b4);//Console.WriteLine(b5);//Console.WriteLine(b6);//IsSubclassOf 跟接口没关系bool b = t.GetType().IsSubclassOf(typeof(I2));//Console.WriteLine(b);Console.WriteLine(typeof(Animal).IsAbstract);Console.WriteLine(typeof(Person).IsAbstract);Console.WriteLine(typeof(I2).IsAbstract);Console.ReadKey();}}class Person{}class Student : Person{ }abstract class Animal{ }interface I1{}interface I2 : I1 { }class Teacher : I2{ }

记事本插件开发

1、Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Plug_in_Rule_DLL;
namespace _10_记事本插件开发
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//程序加载的时候,读取指定目录下的插件//1、获取插件存储文件夹的路径string path = Assembly.GetExecutingAssembly().Location;path = Path.GetDirectoryName(path);path = Path.Combine(path, "Plug-in-Components");//2、读取该路径下所有的插件string[] files = Directory.GetFiles(path);//3、通过Assembly去加载程序集foreach (var file in files){//4、获取到当前循环到的插件程序集Assembly ass = Assembly.LoadFile(file);//5、获取程序集中的元数据//types:都是程序集中的数据类型。(类、接口、抽象类、委托、事件、.......)Type[] types = ass.GetExportedTypes();//6、对types做筛选foreach (var type in types){//筛选条件:1、实现了Plug_in_Rule接口的类     2、不能接口或者抽象类if (typeof(Plug_in_Rule).IsAssignableFrom(type) && !type.IsAbstract){//7、获取类型中的属性和方法//动态的创建插件的对象object o = Activator.CreateInstance(type);Plug_in_Rule pir = (Plug_in_Rule)o;//调用Name属性,赋值给MenustripToolStripItem tsi = menuStrip1.Items.Add(pir.Name);//8、给添加的小选项卡设置单击事件tsi.Click += Tsi_Click;//9、把pir接口,从Load方法中,传到Tsi_Click中tsi.Tag = pir;}}}//通过反射,获取程序集中的数据:Name ChangeText()//把Name加载到Menustrip菜单中,给菜单注册一个单击事件//单击的时候,执行ChangeText}//单击选项卡的时候,调用ChangeText()private void Tsi_Click(object sender, EventArgs e){//sender  事件是谁的,sender就是谁ToolStripItem tsi = sender as ToolStripItem;Plug_in_Rule p = (Plug_in_Rule)tsi.Tag;p.ChangeText(textBox1);}}
}

2、Plug_in_Rule 插件开发的接口规范

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Plug_in_Rule_DLL
{/// <summary>/// 插件开发的接口规范/// </summary>public interface Plug_in_Rule{//接口中的只读属性,不是自动属性string Name { get; }//让插件开发人员,实现该方法,对文本的样式进行修改void ChangeText(TextBox textBox);}
}

3、Str_To_Lower 全部转小写功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Plug_in_Rule_DLL;
using System.Windows.Forms;
namespace Str_To_Lower_DLL
{public class Str_To_Lower : Plug_in_Rule{public string Name { get { return "全部转小写!!!!!"; } }public void ChangeText(System.Windows.Forms.TextBox textBox){textBox.Text = textBox.Text.ToLower();}}
}

4、Str_To_Upper 全部转大写功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Plug_in_Rule_DLL;
using System.Windows.Forms;
namespace Str_To_Upper_DLL
{/// <summary>/// 要拓展插件功能的人/// </summary>public class Str_To_Upper : Plug_in_Rule{public string Name { get { return "全部转大写!!!!"; } }public void ChangeText(System.Windows.Forms.TextBox textBox){textBox.Text = textBox.Text.ToUpper();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/261802.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费搭建个人网盘

免费搭建一个属于个人的网盘。 服务端 详情请参考原网站的服务端下载和安装虚拟磁盘Fuse4Ui可以支持把网盘内容挂载成系统的分区&#xff1b; 挂载工具效果图&#xff1a;应用端应用端的下载 效果图

Meta 发布 MMCSG (多模态智能眼镜对话数据集)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《图解设计模式》笔记(一)适应设计模式

图灵社区 - 图解设计模式 - 随书下载 评论区 雨帆 2017-01-11 16:14:04 对于设计模式&#xff0c;我个人认为&#xff0c;其实代码和设计原则才是最好的老师。理解了 SOLID&#xff0c;如何 SOLID&#xff0c;自然而然地就用起来设计模式了。Github 上有一个 tdd-training&…

科技快讯:鸿道Intewell操作系统突破国际垄断,引领工控新革命

科东软件Intewell鸿道工业操作系统&#xff0c;已在多种严苛环境下运行检验&#xff0c;并应用于工业控制、智能制造、汽车电子、轨道交通、能源电力、航天航空等实时性要求极高的领域&#xff0c;历经30年的不懈努力和研发迭代&#xff0c;在功能和性能上可以替代风和VxWorks操…

RTP 实时运输协议

目录 1 实时运输协议 RTP 1.1 RTP 的层次 1.2 RTP 分组的首部格式 2 实时运输控制协议 RTCP 2.1 RTCP 分组 1 实时运输协议 RTP 实时运输协议 RTP (Real-time Transport Protocol) 为实时应用提供端到端的运输&#xff0c;但不提供任何服务质量的保证。 需要发送的多媒体…

【Linux系统化学习】深入理解匿名管道(pipe)和命名管道(fifo)

目录 进程间通信 进程间通信目的 进程间通信的方式 管道 System V IPC&#xff08;本地通信&#xff09; POSIX IPC&#xff08;网络通信&#xff09; 管道 什么是管道 匿名管道 匿名管道的创建 匿名管道的使用 匿名管道的四种情况 匿名管道的五种特性 命名管道 …

瑞_Redis_初识Redis(含安装教程)

文章目录 1 初识Redis1.1 认识NoSQL1.1.1 结构化与非结构化1.1.2 关联和非关联1.1.3 查询方式1.1.4 事务1.1.5 总结 1.2 认识Redis1.2.1 介绍1.2.2 特征1.2.3 优势 1.3 安装Redis ★★★1.3.1 Linux安装Redis1.3.1.1 安装Redis依赖 1.3.2 Windows安装Redis1.3.2.1 安装步骤1.3.…

抛弃chatgpt,使用微软的Cursor提升coding效率

Whats Cursor? Cursor编辑器是一个基于GPT-4的代码编辑器&#xff0c;它可以根据用户的自然语言指令或者正在编辑的代码上下文为用户提供代码建议&#xff0c;支持多种编程语言&#xff0c;如Python、Java、C/C#、go等。Cursor编辑器还可以帮助用户重构、理解和优化代码&…

Code Control Process

代码提交流程&#xff08;Code Control Process&#xff09; VSS&#xff0c;早前定义的版本控制&#xff0c;没有谁对不对&#xff0c;但是要根本解决冲突&#xff0c;特别人多的时候&#xff0c;50个人的时候&#xff0c;处理冲突时非常的麻烦的&#xff0c;改半天还改错了&…

vulfocus靶场搭建

vulfocus靶场搭建 什么是vulfocus搭建教程靶场配置场景靶场编排靶场优化 什么是vulfocus Vulfocus 是一个漏洞集成平台&#xff0c;将漏洞环境 docker 镜像&#xff0c;放入即可使用&#xff0c;开箱即用&#xff0c;我们可以通过搭建该靶场&#xff0c;简单方便地复现一些框架…

Java面试题之分布式/微服务篇

经济依旧不景气啊&#xff0c;如此大环境下Java还是这么卷&#xff0c;又是一年一次的金三银四。 兄弟们&#xff0c;你准备好了吗&#xff1f;冲冲冲&#xff01;欧里给&#xff01; 分布式/微服务相关面试题解 题一&#xff1a;CAP理论&#xff0c;BASE理论题二&#xff1a;…

企业电子招投标系统源码之电子招投标系统建设的重点和未来趋势

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

如何使用Docker部署MongoDB并结合内网穿透实现远程访问本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 …

SICTF Round#3 の WP

Misc 签到 SICTF{1f4ce05a-0fed-42dc-9510-6e76dff8ff53} Crypto [签到]Vigenere 附件内容&#xff1a; Gn taj xirly gf Fxgjuakd, oe igywnd mt tegbs mnrxxlrivywd sngearbsw wakksre. Bs kpimj gf tank, it bx gur bslenmngn th jfdetagur mt ceei yze Ugnled Lystel t…

mysql 2-22

变量 查看系统变量 修改 用户变量 赋值 定义处理程序 流程控制 IF CASE LOOP语句 WHILE循环 REPEAT leave ITERATE 游标 使用步骤 全局系统变量持久化 触发器 查看触发器 优点 MYSQL8的新特性 移除的旧特性 窗口函数 公用表表达式 JDBC 存储引擎 MYISAM存储引擎 InnoDB存储引擎…

跟着pink老师前端入门教程(JavaScript)-day05

六、语句 &#xff08;一&#xff09;表达式和语句 1、表达式 表达式是可以被求值的代码&#xff0c;JavaScript 引擎会将其计算出一个结果。 2、语句 语句是一段可以执行的代码。 比如&#xff1a; prompt() 可以弹出一个输入框&#xff0c;还有 if语句 for 循环语句等…

npm run serve启动报错npm ERR! Missing script: “serve“

启动项目的时候用npm run serve发现报了以下的错误 解决方法&#xff1a; 1.一般情况下&#xff0c;这个问题是因为package.json文件里面确实没有 这里没有可能因为你的脚手架版本比较低&#xff0c;如果不想换&#xff0c;可以用 这里面有的 npm run dev去启动也是可以的 n…

ubuntu20.04安装实时内核补丁PREEMPT_RT

参考&#xff1a; Ubuntu 18.04安装 RT-PREEMPT 实时内核及补丁【过程记录】_ubuntu18.04 preempt rt linux 5.6.19-CSDN博客 https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/ur_robot_driver/doc/real_time.md当前内核&#xff1a;5.15.0-94-ge…

前端基础自学整理|DOM树

DOM&#xff0c;文档对象模型&#xff08;Document Object Model&#xff09;&#xff0c;简单的说&#xff0c;DOM是一种理念&#xff0c;一种思想&#xff0c;一个与系统平台和编程语言无关的接口&#xff0c;一种方法, 使 Web开发人员可以访问HTML元素&#xff01;不是具体方…

LLM之RAG实战(二十七)| 如何评估RAG系统

有没有想过今天的一些应用程序是如何看起来几乎神奇地智能的&#xff1f;这种魔力很大一部分来自于一种叫做RAG和LLM的东西。把RAG&#xff08;Retrieval Augmented Generation&#xff09;想象成人工智能世界里聪明的书呆子&#xff0c;它会挖掘大量信息&#xff0c;准确地找到…