执行具有可变参数和返回类型的C#函数列表

时间:2019-02-04 13:39:33

标签: c#

尝试使用C#的Action / Func功能执行带有各种参数的方法列表。这是一些示例代码(未编译),这些代码说明了我要执行的操作:

class Program
    {
        static void Main(string[] args)
        {
            List<Action> actions = getRelevantRules();
            foreach (Action a in actions)
            {
                String result = a.Invoke();
                Console.WriteLine("Got.." + result);
            }
        }

        public static List<Action> getRelevantRules()
        {
            List<Action> relevant = new List<Action>();

            relevant.Add(ruleCombintIt("Str1","Str2"));
            relevant.Add(ruleEchoIt("Str1"));
            relevant.Add(ruleChangeCase("Str1",true));

            return relevant;
        }

        public static String ruleEchoIt(String val)
        {
            return val;
        }

        public static String ruleChangeCase(String val, Boolean toUpper)
        {
            return (toUpper) ? val.ToUpper() : val.ToLower();
        }

        public static String ruleCombintIt(String val1, String val2)
        {
            return val1 + val2;
        }
    }

我知道不能使用“动作”,因为它不返回结果。但是,我确实需要能够返回结果。我已经尝试过(无法成功地看到如何使用Func和Delegate来实现这一点)

主要要求: 1)需要能够获取String返回值 2)在将项目添加到列表时,需要能够设置函数的实际参数值。 3)需要能够处理添加到列表中的每种方法可能具有不同参数的情况(如图所示)。

我想要做的事情可以做吗? 感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

您似乎真正想要的是List<Func<string>>-Func<string>不带参数并返回字符串。

工作代码:

public class Program
{
    public static void Main(string[] args)
    {
        List<Func<string>> actions = getRelevantRules();
        foreach (var a in actions)
        {
            String result = a();
            Console.WriteLine("Got.." + result);
        }
    }

    public static List<Func<string>> getRelevantRules()
    {
        List<Func<string>> relevant = new List<Func<string>>();

        relevant.Add(() => ruleCombintIt("Str1","Str2"));
        relevant.Add(() => ruleEchoIt("Str1"));
        relevant.Add(() => ruleChangeCase("Str1",true));

        return relevant;
    }

    public static String ruleEchoIt(String val)
    {
        return val;
    }

    public static String ruleChangeCase(String val, Boolean toUpper)
    {
        return (toUpper) ? val.ToUpper() : val.ToLower();
    }

    public static String ruleCombintIt(String val1, String val2)
    {
        return val1 + val2;
    }
}

这似乎可以满足您的所有关键要求:

  

1)需要能够获取String返回值

Func<string>

感到满意
  

2)在将项目添加到列表时,需要能够设置函数的实际参数值。

很高兴您说设置参数 values -而不是参数类型。由于您无法轻松地将Func<string,string,string>Func<string, bool, string>存储在同一集合中,因此要实现此目标将更加困难。

  

3)需要能够处理添加到列表中的每种方法可能具有不同参数的情况(如图所示)。

只要上述2)成立,就没有问题。