如何使用Action,Delegate或List执行方法列表?

时间:2014-02-05 12:38:21

标签: c# list delegates action

假设我有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);
)

执行此操作的最佳方式是:操作,列表,代表等...

注意:我读过它们,但在这个特定场景中并不知道如何使用它

5 个答案:

答案 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上提出这个问题而非常容易实现。