如何在C#中组合多播委托返回的结果?
我希望通过调用多播委托来组合两个函数调用返回的结果。但我一直得到一个例外,说del是一个变量,但被用作一个方法如何在C#中组合多播委托返回的结果?,c#,delegates,C#,Delegates,我希望通过调用多播委托来组合两个函数调用返回的结果。但我一直得到一个例外,说del是一个变量,但被用作一个方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MultiDelegateConsoleApplication { public delegate void SampleMu
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MultiDelegateConsoleApplication
{
public delegate void SampleMultiDelegate(string args,out string SampleString);
class Program
{
public static void SayHello(string args,out string s1)
{
s1 = "Hello " + args;
}
public static void SayGoodbye(string args,out string s2)
{
s2 = "Goodbye " + args;
}
static void Main(string[] args)
{
SampleMultiDelegate sampleMultiDelegate = new SampleMultiDelegate(SayHello);
sampleMultiDelegate += SayGoodbye;
string param1 = "Chiranjib";
string param2,param3;
Console.WriteLine("**************Individual Function Invoke***********");
SayHello(param1,out param2);
SayGoodbye(param1, out param3);
Console.WriteLine("**************Multicast Delegate Invoke***********");
sampleMultiDelegate(param1,out param2);
Console.WriteLine(param2); //The multicast delegate will always return the result of the last function
string result;
foreach (Delegate del in sampleMultiDelegate.GetInvocationList())
{
result = del(param1,out param2);
}
Console.ReadKey();
Console.ReadLine();
}
}
}
您可以解释并帮助我修复错误吗?您需要将调用列表中的每个函数强制转换为委托类型,以便能够使用正常的函数调用语法:
void Main()
{
var sampleMultiDelegate = new SampleMultiDelegate(SayHello);
sampleMultiDelegate += SayGoodbye;
var param1 = "Chiranjib";
string param2;
string result = "";
foreach (var del in sampleMultiDelegate.GetInvocationList())
{
var f = (SampleMultiDelegate)del;
f(param1, out param2);
result += param2 + "\r\n";
}
Console.WriteLine(result);
}
还修复了委托调用返回
void
时无法产生任何结果的问题。您需要将调用列表中的每个函数强制转换为委托类型,以便能够使用正常的函数调用语法:
void Main()
{
var sampleMultiDelegate = new SampleMultiDelegate(SayHello);
sampleMultiDelegate += SayGoodbye;
var param1 = "Chiranjib";
string param2;
string result = "";
foreach (var del in sampleMultiDelegate.GetInvocationList())
{
var f = (SampleMultiDelegate)del;
f(param1, out param2);
result += param2 + "\r\n";
}
Console.WriteLine(result);
}
还修复了代理调用返回
void
时不能有任何结果的事实。此代码用于获取每个结果。关键是我的unfull
函数,它更改返回类型
SampleMultiDelegate sampleMultiDelegate = new SampleMultiDelegate(SayHello);
sampleMultiDelegate += SayGoodbye;
string param1 = "Chiranjib";
Func<SampleMultiDelegate, string, string> unfurl =
(d, p1) =>
{
string r;
d(p1, out r);
return r;
};
string result =
String.Join(
Environment.NewLine,
sampleMultiDelegate
.GetInvocationList()
.Cast<SampleMultiDelegate>()
.Select(d => unfurl(d, param1)));
Console.WriteLine(result);
SampleMultiDelegate SampleMultiDelegate=新的SampleMultiDelegate(SayHello);
sampleMultiDelegate+=说再见;
字符串param1=“Chiranjib”;
函数展开=
(d,p1)=>
{
字符串r;
d(p1,out r);
返回r;
};
字符串结果=
串,加入(
环境,新线,
样本多重委托
.GetInvocationList()
.Cast()
。选择(d=>展开(d,参数1));
控制台写入线(结果);
此代码用于获取每个结果。关键是我的unfull
函数,它更改返回类型
SampleMultiDelegate sampleMultiDelegate = new SampleMultiDelegate(SayHello);
sampleMultiDelegate += SayGoodbye;
string param1 = "Chiranjib";
Func<SampleMultiDelegate, string, string> unfurl =
(d, p1) =>
{
string r;
d(p1, out r);
return r;
};
string result =
String.Join(
Environment.NewLine,
sampleMultiDelegate
.GetInvocationList()
.Cast<SampleMultiDelegate>()
.Select(d => unfurl(d, param1)));
Console.WriteLine(result);
SampleMultiDelegate SampleMultiDelegate=新的SampleMultiDelegate(SayHello);
sampleMultiDelegate+=说再见;
字符串param1=“Chiranjib”;
函数展开=
(d,p1)=>
{
字符串r;
d(p1,out r);
返回r;
};
字符串结果=
串,加入(
环境,新线,
样本多重委托
.GetInvocationList()
.Cast()
。选择(d=>展开(d,参数1));
控制台写入线(结果);
当代理返回类型为void
时,为什么希望del
返回值。不是Delegate
,而是SampleMultiDelegate
2SampleMultiDelegate
返回void
,因此只需编写del(param1,out param2)代码>当代理返回类型为void
时,为什么希望del
返回值。不是Delegate
,而是SampleMultiDelegate
2SampleMultiDelegate
返回void
,因此只需编写del(param1,out param2)代码>谢谢你的帮助:)效果很好!谢谢你的帮助:)效果很好!