c# - 如何用 Dictionary<string, Func<>> 替换这个 switch-case ?

标签 c# refactoring func

我讨厌开关盒。我正在尝试重构代码中的 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/

相关文章:

c# - 重构帮助c#

c# - 最小起订量 功能参数

c# - 通过 Visual Studio Automation 设置项目的 OutputPath 属性

c++ - 重构:在 CLion 中移动 (F6) - 为什么它会这样工作?

c# - System.Drawing.dll 中出现类型为 'System.ApplicationException' 的未处理异常

ruby-on-rails-3 - 适用于 Mac 的 Rails 代码重构工具

C#:Func<> 而不是方法?

c# - 我应该在接线员的右边写什么?

c# - Bitbucket 管道 .net 部署

c# - 绑定(bind) x :Load, 更新绑定(bind)值不加载控件 (UWP)