尝试使用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)需要能够处理添加到列表中的每种方法可能具有不同参数的情况(如图所示)。
我想要做的事情可以做吗? 感谢您的帮助!
答案 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)成立,就没有问题。