我讨厌开关盒。我正在尝试重构代码中的 switch-case,如下所示:
int i = 0;
string str = string.empty;
switch (color)
{
case "red":
i = MyIntArgsFunction(1, 2);
case "blue":
str = MyStringArgsFunction("cat", "dog");
}
private int MyIntArgsFunction(int x, int y)
{
// Implementation
}
private string MyStringArgsFunction(string s, string t)
{
// Implementation
}
我想将 2 个函数 MyIntArgsFunction 和 MyStringArgsFunction 添加到 Dictionary> 结构中,然后根据用户选择的颜色调用适当的函数。但由于它们的参数不同,我无法为 Func 委托(delegate)找到合适的签名。
有人可以帮忙吗?
尼哈尔
最佳答案
看起来很糟糕,但它确实有效:)
private static void Main(string[] args)
{
var blueHandler = new Action<string, string>((x, y) => { });
var redHandler = new Action<int, int>((x, y) => { Console.WriteLine(x);});
var redStr = "Red";
var blueStr = "Blue";
var colorSelector = new Dictionary<string, Invoker>();
var a = 10;
var b = 20;
colorSelector.Add(redStr, new Invoker(redHandler, a, b));
colorSelector.Add(blueStr, new Invoker(blueHandler, a, b));
colorSelector["Red"].Invoke();
}
public class Invoker
{
private Delegate _handler;
public object[] _param;
public Invoker(Delegate handler, params object[] param)
{
_param = param;
_handler = handler;
}
public void Invoke()
{
_handler.DynamicInvoke(_param);
}
}
关于c# - 如何用 Dictionary<string, Func<>> 替换这个 switch-case ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34000659/