假设我有3个方法在同一个类中具有相同的签名
Void Method1(string a, string b)
Void Method2(string a, string b)
Void Method3(string a, string b)
我想以这种方式调用该方法:
foreach(Item item in T)
(
item(a,b);
)
执行此操作的最佳方式是:操作,列表,代表等...
注意:我读过它们,但在这个特定场景中并不知道如何使用它
答案 0 :(得分:2)
假设您的实际方法确实返回无效,您可以使用MulticastDelegate
Action<string, string> action = Method1;
action += Method2; //promote delegate to Multicast Delegate
action += Method3;
action("x", "y");
如果您的方法返回其他内容,并且您确实希望能够访问所有三个返回值,则不应使用多播委托。例如,如果方法返回一个int,那么int i = action("x", "y");
只会捕获要调用的 last 方法的返回值。
在这种情况下,您应该单独调用每个方法。
注意:既然你说过“行动,代表或列表”,我觉得指出Action<T>
是代表是很重要的。
答案 1 :(得分:1)
您可以使用Delegates
来调用具有相同签名的多个方法。
试试这个:
public delegate void myDelegate(string a, string b);
myDelegate delMethods = new myDelegate(method1);
delMethods+=new myDelegate(method2);
delMethods+= new myDelegate(method3);
delMethods("a","b");
答案 2 :(得分:1)
如果要以指定的方式调用方法,请执行以下操作:
var methods = new List<Action<string, string>> {
Method1,
Method2,
Method3
};
foreach (var method in methods) {
item(a, b);
)
答案 3 :(得分:1)
您可以编写一个这样的辅助方法:
public static void Call<T1, T2>(T1 arg1, T2 arg2, params Action<T1, T2>[] actions)
{
foreach (var action in actions)
action(arg1, arg2);
}
然后你可以像这样使用它:
using System;
namespace Demo
{
internal class Program
{
private void run()
{
Call("a", "b", method1, method2, method3);
// You can pass as many methods as you need:
Call("a", "b", method1, method2, method3, method1, method2, method3);
}
public static void Call<T1, T2>(T1 arg1, T2 arg2, params Action<T1, T2>[] actions)
{
foreach (var action in actions)
action(arg1, arg2);
}
private static void method1(string a, string b)
{
Console.WriteLine("method1(), a = " + a + ", b = " + b);
}
private static void method2(string a, string b)
{
Console.WriteLine("method2(), a = " + a + ", b = " + b);
}
private static void method3(string a, string b)
{
Console.WriteLine("method3(), a = " + a + ", b = " + b);
}
private static void Main()
{
new Program().run();
}
}
}
但是,我可能只是使用@dcastro提供的多播委托解决方案。
答案 4 :(得分:0)
public delegate void customDelegate(string a, string b);
customDelegate methodsDelegate = new customDelegate(method1);
methodsDelegate+=new customDelegate (method2);
methodsDelegate+= new customDelegate (method3);
methodsDelegate("a","b");
无论订阅的顺序是什么,都会调用相同的序列。
但在执行此操作之前,您应该正确阅读和理解委托,因为它可以在StackOverFlow上提出这个问题而非常容易实现。