您的位置:首页 > 编程语言 > C#

通过反射,获取多路委托的全部返回结果

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();

}

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#Delegate