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.mzph.cn/news/695563.shtml

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

相关文章

React快速入门(二)组件与函数

React快速入门&#xff08;二&#xff09;组件与函数React脚手架React组件化开发setState原理React更新机制使用ref受控/非受控组件高阶函数Portals/fragment/StrictMode React快速入门&#xff08;二&#xff09;组件与函数 React脚手架 脚手架让项目从搭建到开发&#xff0…

《游戏引擎架构》--学习3

内存管理 优化动态内存分配 维持最低限度的堆分配&#xff0c;并且永不在紧凑循环中使用堆分配 容器 迭代器 Unicode

TCP 三次握手和四次挥手

为了准确无误地把数据送达目标处&#xff0c;TCP协议采用了三次握手策略。 1 TCP 三次握手漫画图解 如下图所示&#xff0c;下面的两个机器人通过3次握手确定了对方能正确接收和发送消息(图片来源网络)。 简单示意图&#xff1a; 客户端–发送带有 SYN 标志的数据包–一次握手…

数据库管理-第153期 Oracle Vector DB AI-05(20240221)

数据库管理153期 2024-02-21 数据库管理-第153期 Oracle Vector DB & AI-05&#xff08;20240221&#xff09;1 Oracle Vector的其他特性示例1&#xff1a;示例2 2 简单使用Oracle Vector环境创建包含Vector数据类型的表插入向量数据 总结 数据库管理-第153期 Oracle Vecto…

采用SSI技术的FPGA器件

9个关于SSI芯片的必知问题-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1530543

无人机快递(物流)技术方案,无人机快递(物流)基础知识

无人机快递技术是一种利用无人机进行快递配送的先进技术。通过利用无人机&#xff0c;快递企业能够在偏远地区或难以通行的地区提供配送服务&#xff0c;同时提高配送效率并降低人力成本。 无人机基本情况 无人驾驶飞机简称“无人机”&#xff0c;是利用无线电遥控设备和自备的…

使用 JMeter 生成测试数据对 MySQL 进行压力测试

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

离散数学(一) 集合

属于关系 表示 枚举法; 叙述法; 文氏图法 基数 空集 全集 全集是相对唯一的

还在为选择办公软件而烦恼吗?不妨试试ONLYofficeV8.0

目录 一.优势一DOC 1.丰富的文字处理功能 2.按用户既定的规则编辑 3.使用AI助手 4.保持创意 5.深入分析文本 6.改善团队工作流程 7.轻松对比文档 8.扩展编辑功能 二.优势二sheet 1.数据分析 2.轻松实现精准计算 3.轻松分析数据 4.可视化呈现数据 5.增强团队协作…

反转链表.

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 解题方法 假设链表为 1→2→3→∅&#xff0c;我们想要把它改成∅←1←2←3。在遍历链表时&#xff0c;将当前节点的 next指针改为指向前一个节点。由于节点没有引用其前一…

写给正在迷茫的你:4年程序员职业生涯感悟

前言 最近有许多小伙伴找我来咨询Python&#xff0c;我来讲几个极其重要&#xff0c;但是大多数Python小白都在一直犯的思维错误吧&#xff01;如果你能早点了解清楚这些&#xff0c;会改变你的编程学习生涯的。小编这一期专门总结了大家问的最多的&#xff0c;关于学习Python…

pytest基本应用

文章目录 1.pytest安装2.用例运行规则3.常用参数断言运行参数用例控制setup和teardownini配置文件 4.常用插件5.pytest高阶用法用例跳过参数化 6.pytest之Fixture使用fixture使用装饰器usefixtures 7.pytest之conftest.py8.conftestfixtureyieldyield介绍前后置使用 1.pytest安…

GZ036 区块链技术应用赛项赛题第9套

2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷&#xff08;9卷&#xff09; 任 务 书 参赛队编号&#xff1a; 背景描述 随着异地务工人员的增多&#xff0c;房屋租赁成为一个广阔是市场&#xff1b;目前&#xff0c;现有技术中的房屋租赁是由…

centos7部署nfs+keepalived+drbd

一、项目需求描述 现在使用的架构是nfskeepalivedrsyncsersync&#xff0c;目前这套架构存在主从nfs节点数据同步不一致问题&#xff0c;大概会有 120s左右的数据延长同步时间&#xff0c;需要提供优化的自动化方案。 二、现有方案缺点 1、切换不能保证主从节点数据一致。 2、…

四、分类算法 - 随机森林

目录 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结 sklearn转换器和估算器KNN算法模型选择和调优朴素贝叶斯算法决策树随机森林 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结

【论文阅读】【yolo系列】YOLO-Pose的论文阅读

Abstract 我们介绍YOLO-pose&#xff0c;一种无热图联合检测的新方法&#xff0c;基于流行的YOLO目标检测框架的图像二维多人姿态估计。 【现有方法的问题】现有的基于热图的两阶段方法是次优的&#xff0c;因为它们不是端到端可训练的&#xff0c;训练依赖于surrogate L1 loss…

12 Autosar_SWS_MemoryMapping.pdf解读

AUTOSAR中MemMap_autosar memmap-CSDN博客 1、Memory Map的作用 1.1 避免RAM的浪费&#xff1a;不同类型的变量&#xff0c;为了对齐造成的空间两份&#xff1b; 1.2 特殊RAM的用途&#xff1a;比如一些变量通过位掩码来获取&#xff0c;如果map到特定RAM可以通过编译器的位掩码…

爬取链家二手房房价数据存入mongodb并进行分析

实验目的 1.使用python将爬虫数据存入mongodb&#xff1b; 2.使用python读取mongodb数据并进行可视化分析。 实验原理 MongoDB是文档数据库&#xff0c;采用BSON的结构来存储数据。在文档中可嵌套其他文档类型&#xff0c;使得MongoDB具有很强的数据描述能力。本节案例使用的…

IP地址定位可以精确到哪里

IP地址定位能够精确到的位置级别取决于多种因素&#xff0c;包括IP地址的分配方式、数据库的质量和更新频率、用户的移动性等。一般而言&#xff0c;IP地址定位可以精确到市级&#xff0c;甚至可以达到街道级别 https://www.ip66.net/?utm-sourceLJ&utm-keyword?1146 但需…

大数据在电商领域的典型应用

大数据作为一种新兴的信息技术&#xff0c;是无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据技术是指在数据获取、存储、管理、…