1.委托
(1):委托是把方法赋值给变量,使用这个变量调用方法的一种技术
(2):实际意义便是让别人代理你的事情
(3):在C#中实现
a.准备方法
b.定义委托类型
c.声明委托变量
d.初始化变量
e.调用
(2):委托的缺点(利用事件解决):
a.可以使用“=”,如果最后一次注册方法使用“=”,则会清除之前注册的方法
b.可以直接使用委托变量调用,还得去判断这个委托变量是否有值
2.匿名方法
3.Lambda表达式
namespace _07匿名方法
{
delegate int AddHandler(int num,int num2);
public class Program
{
static void Main(string[] args)
{
//匿名方法
AddHandler handler=delegate(int n1,int n2){
return n1 + n2;
};
Console.WriteLine(handler(12,34));
// Lambda表达式,是对匿名方法的进一步简化
AddHandler handler2 = (n1, n2) => { return n1 + n2; };
Console.WriteLine(handler(56, 67));
Console.ReadKey();
}
}
}
4.使用Lambda表达式实现集合的查找
namespace _03利用Lambda实现集合的查找
{
//定义委托类型
public delegate bool SeachHandler(string s);
static class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>("赵晓虎,王小虎,乐虎,老虎,东北虎,华南虎".Split(','));
//匿名方法
List<string> result1 = list.JKWhere(delegate(string str) { return Regex.IsMatch(str, "晓|小"); });
//Lambda表达式
List<string> result2 = list.JKWhere(o => Regex.IsMatch(o, "晓|小"));
}
}
static class ListExt
{
//集合扩展方法(静态类,静态方法,this)
public static List<string> JKWhere(this List<string> list,SeachHandler search)
{
List<string> result = new List<string>();
foreach (string s in list)
{
if (search(s))
{
result.Add(s);
}
}
return result;
}
}
}
5.多播委托(委托链):一个委托变量,存储多个方法,调用一次,多个方法依次执行
多播委托的语法,使用+=追加方法,使用-=移除第一个找到的方法
6.系统自带的泛型委托:
Func<in T1,in T2,...,out TResult >:可以有参数,也可以没有参数,但必须有返回值。17个重载方法
Action:无参数,无返回值
Action<in T1,in T2,...>:有参数,无返回值
7.事件(在委托变量前面加event关键字,***事件可以实现窗体的传值)
委托使用的缺陷
事件就是被限制使用的委托变量
事件语法(public event 委托类型 事件名)
class Teacher
{
public event Action _收作业;
public void _打铃考试结束()
{
if (_收作业 != null)
{
_收作业();
}
}
}
class Student
{
public string Name { get; set; }
public void _交试卷()
{
Console.WriteLine("{0},把试卷上交了", Name);
}
}
class Program
{
static void Main(string[] args)
{
// 时间的本质
// 事件的实现必须要有
// 1、一个委托的类型
// 2、有一个类
// 3、这个类型中有一个"委托类型的变量"(加上event的委托变量)
// 4、触法事件的方法
// 事件过程的概念
// 一个事件触发需要经历几个步骤?
// 要有事件源,触法者,干了什么事儿
// 要有相应,一旦触发就会调用某一个方法
// 触法事件方法,判断事件变量是否为空,如果不为空就调用方法
Teacher tch = new Teacher();
Student s1 = new Student() { Name = "赵晓虎" };
Student s2 = new Student() { Name = "马伦" };
Student s3 = new Student() { Name = "刘岐" };
Student s4 = new Student() { Name = "王成伟" };
// 绑定方法的功能
tch._收作业 += s1._交试卷;
tch._收作业 += s2._交试卷;
tch._收作业 += s3._交试卷;
tch._收作业 += s4._交试卷;
tch._打铃考试结束();
Console.ReadKey();
}
}
8.反射(可以调用私有方法??)
反射是读取程序集信息并使用这些数据的技术。例如得到私有成员、获得内部类的对象等。
程序集
程序集是由.NET平台编译得到的中间产物,以供CLR编译执行。它包含资源、元数据和IL代码等。
数据是什么
类型描述数据、成员描述数据等
能做什么
在未定义类型的条件下创建对象,并调用执行方法
a、获得Type类型的数据
b、使用Activator.CreateInstance(Type)创建对象
c、使用Type类型的Get系方法获得需要的数据(字段、属性、方法等)
d、使用
属性,利用属性对象.SetValue与GetValue获得该对象的数据
方法,利用Invoke方法进行调用
namespace MyLibrary
{
public class Class1
{
private int SelfAdd(int num)
{
return num++;
}
private int SelfAdd(int num1, int num2)
{
return num1 + num2;
}
public void SelfSayHello(string name)
{
Console.WriteLine("大家好,我是{0}",name);
}
}
}
static void Main(string[] args)
{
string path = "MyLibrary.dll";
if (File.Exists(path))
{
//加载程序集(完整路径)
Assembly assembly = Assembly.LoadFile(Path.GetFullPath(path));
//获得类型数据(完整的类名)
Type t = assembly.GetType("MyLibrary.Class1");
//创建对象
Object obj=Activator.CreateInstance(t);
//获取方法
MethodInfo method = t.GetMethod("SelfSayHello", BindingFlags.Public | BindingFlags.Instance);
//调用方法 Invoke(对象,参数)
method.Invoke(obj, new object[] { "曹伟" });
}
}
委托,事件和反射
最新推荐文章于 2024-01-16 19:36:23 发布