通过反射,获取多路委托的全部返回结果
2016-06-03 17:09
561 查看
今天翻看了,之前学习的C#委托的代码,发现一个委托对象里,指向多个函数指针,但最后输出的时候,虽然每个果进行计算或处理。我通过GetInvocationList的方法,获得了加入这个委托对象的全部函数指针,返回delegate[]类型的结果。通过遍历这个这个委托数组的结果,来获取其中的所有委托方法的信息,通过委托对象的method属性,来获得该方法的信息。通过反射来调用这个方法。然后把这个结果放在一个集合里,以便后面的处理。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EventAndDelegateAndLamda.DelegateDemo;
using System.Reflection;
namespace EventAndDelegateAndLamda
{
class Program
{
static void Main(string[] args)
{
Test1();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EventAndDelegateAndLamda.DelegateDemo;
using System.Reflection;
namespace EventAndDelegateAndLamda
{
class Program
{
static void Main(string[] args)
{
Test1();
}
public static void Test1() { Demo2 demo2 = new Demo2(); Demo1.MyDelegate1 myDelegate = new Demo1.MyDelegate1(demo2.Introduction); //myDelegate("lifanfei"); // 委托变量名 = 方法时 覆盖之前的函数指针 myDelegate += demo2.SayHi; // 委托变量名 += 方法时 增加一个函数指针,实现多路委托 //myDelegate += demo2.SayHi; myDelegate("likexin"); Demo1.MyDelegate2 myDelegate2 = new Demo1.MyDelegate2(demo2.GoodAfternoon); string msg = myDelegate2("marry"); Console.WriteLine(msg); Demo3 demo3 = new Demo3(); //给委托添加函数指针 Demo1.MultiDelegate3 myDelegate3 = new Demo1.MultiDelegate3(demo3.Ordinary); myDelegate3 += new Demo1.MultiDelegate3(demo3.Favourable); //创建一个集合来返回我们方法的返回结果 List<double> list = new List<double>(); //过得委托对象里的全部方法信息 Delegate[] delArray = myDelegate3.GetInvocationList(); //反射调用委托对象里的方法,放到集合里 foreach (Delegate del in delArray) { MethodInfo m = del.Method; list.Add(int.Parse(m.Invoke(demo3,new object[]{100}).ToString())); } for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } } } namespace DelegateDemo { public class Demo1 { public delegate void MyDelegate1(string data); public delegate string MyDelegate2(string data); public delegate double MultiDelegate3(double price); } public class Demo2 { public void Hello() { Console.WriteLine("Good Morning"); } public void SayHi(string name) { Console.WriteLine("HI" + name); } public void Introduction(string name) { Console.WriteLine("my name is " + name); } public string GoodAfternoon(string name) { return "Good Afternoon " + name; } } public class Demo3 { public double Ordinary(double price) { double pricel = 0.95 * price; //Console.WriteLine("Oedinary Price P:" + pricel); return pricel; } public double Favourable(double price) { double pricel = 0.85 * price; //Console.WriteLine("Favourable Price : " + pricel); return pricel; } } }
}
相关文章推荐
- 基于C#委托的深入分析
- C#基础之匿名方法实例教程
- 从datagridview中导出数据到excel
- c#泛型结合Linq实现从数据源中截取指定位置,行数的数据
- C#的枚举数(Enumerator)和可枚举类型(Enumerable)
- 七牛时间戳防盗链生成csharp,c#实现
- C# WPF 命令行输入
- C#/串口助手开发
- 计时器定时播放音乐
- 闲暇之余,兴趣所致
- VS 之 C# 通过console 调用 exe 程序,窗口隐藏设置
- C#获取进程的主窗口句柄
- C#中 IoC 的实现
- C#依赖注入那些事儿(二)
- C#依赖注入那些事儿(一)
- C# 异步
- C# 执行dos命令及批处理
- C#指定下标position读取文本,并返回正确position;
- c#基础语法笔记----个人学习笔记
- XML反射解析