委托,事件和反射

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[] { "曹伟" });
            }
        }
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值