本文共 2591 字,大约阅读时间需要 8 分钟。
在C#中,当使用委托代理多个函数时,如果每次都使用+=来添加新的函数到同一个委托链中,可能会遇到一个问题:每次添加新的函数都会覆盖之前的委托,导致最终只能看到最后一个函数的返回值。为了正确地获取所有函数的返回值,可以使用GetInvocationList方法来遍历委托链中的所有函数。
以下是详细的解决方案:
定义委托和类:
TestDelegate,其返回类型为string。DelegateClass,包含一个TestDelegate类型的属性testDelegate。在Main方法中创建函数实例并添加到委托链:
one、two、three和four,它们都实现了Say方法,返回不同的字符串。Say方法添加到DelegateClass的testDelegate属性中。调用委托并遍历所有函数:
DelegateClass类中实现InvokeDelegate方法。InvokeDelegate方法中,检查testDelegate是否不为空。GetInvocationList方法获取委托链中的所有函数。TestDelegate类型并调用,获取返回值。完整代码示例:
using System;namespace GetInvocationListDemo{ public delegate string TestDelegate(); public class Program { static void Main(string[] args) { DelegateClass delegateClass = new DelegateClass(); TestMethodOne one = new TestMethodOne(); TestMethodTwo two = new TestMethodTwo(); TestMethodThree three = new TestMethodThree(); TestMethodFour four = new TestMethodFour(); delegateClass.testDelegate += one.Say; delegateClass.testDelegate += two.Say; delegateClass.testDelegate += three.Say; delegateClass.testDelegate += four.Say; delegateClass.InvokeDelegate(); Console.ReadKey(); } } public class DelegateClass { public TestDelegate testDelegate; public void InvokeDelegate() { if (testDelegate != null) { foreach (Delegate dele in testDelegate.GetInvocationList()) { TestDelegate delegateClass = (TestDelegate)dele; string resultStr = delegateClass(); Console.WriteLine(resultStr); } } } } public class TestMethodOne { public string Say() { return "You called me from TestMethodOne~~~"; } } public class TestMethodTwo { public string Say() { return "You called me from TestMethodTwo~~~"; } } public class TestMethodThree { public string Say() { return "You called me from TestMethodThree~~~"; } } public class TestMethodFour { public string Say() { return "You called me from TestMethodFour~~~"; } }}运行结果:
You called me from TestMethodOne~~~You called me from TestMethodTwo~~~You called me from TestMethodThree~~~You called me from TestMethodFour~~~
通过使用GetInvocationList方法,可以确保所有添加到委托链中的函数都会被调用并获取其返回值,从而避免只保留最后一个函数的结果。
转载地址:http://pdlvz.baihongyu.com/