在C#中处理交换机案例的更好方法

时间:2017-11-22 22:01:06

标签: c# coding-style enums

如果我的问题看起来很愚蠢,我会提前道歉,但出于某种原因,我无法通过更优雅的方式解决问题。所以我有一个利用switch-case块的方法,类似于下面的代码块:

public enum Items
{
    item_1, item_2, item_3, .... item_N
};

private string String_1 {get; set;}
private string String_2 {get; set;}
private string String_3 {get; set;}
// ...
private string String_N {get; set;}

public void DoSomething(Items item){
    switch(item){
        case item_1:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_1);
            break;

        case item_2:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_2);
            break;

        case item_3:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_3);
            break;
        // ...
        case item_N:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_N);

从上面的示例可以看出,switch语句调用的方法相同,唯一的区别是最后一次Console调用。

我的问题:是否有一种更优雅的方式来处理这种情况,因为我并不喜欢代码的重复。到目前为止,我尝试执行Items枚举来分隔类并将其作为参数传递,但这种方法不起作用,因为静态类不能作为参数在C#中传递

public static class Items {
    public string String_1 {get; set;}
    public string String_2 {get; set;}
    public string String_3 {get; set;}
    // ...
    private string String_N {get; set;}
}

// ....

public void DoSomething(Items item)
  • 不允许声明此方法

非常感谢任何建议。

2 个答案:

答案 0 :(得分:7)

您可以将enum ItemsString_X映射存储在字典中,而不是依赖于切换。

private IDictionary<Items, string> _itemStringMap = new Dicitionary<Items, string>()
{
   { Items.item_1, String_1 },
   //Other items here
};

public void DoSomething(Items item)
{
  var s = _itemStringMap[item];

  MethodNumberOne();
  MethodNumberTwo();
  MethodNumberThree();
  Console.WriteLine($"{0} is displayed on the page", s);
}

您可能想要检查item参数是否具有有效映射,如果不使用默认字符串。

答案 1 :(得分:4)

清理它的最简单方法是引入一个变量。

public void DoSomething(Items item){

    string foo;
    switch(item){
        case item_1:
            foo = String_1;
            break;

        case item_2:
            foo = String_2;
            break;

        case item_3:
            foo = String_3;
            break;
        // ...
        case item_N:
            foo = String_N;
            break;
    }

    MethodNumberOne();
    MethodNumberTwo();
    MethodNumberThree();
    Console.WriteLine($"{0} is displayed on the page", foo);

}

这清楚地表明我们真正拥有的是键/值对,因此我们可以更进一步将字符串存储在字典中。

var dict = new Dictionary<Items,string>()
{
    { item_1, string_1 },
    { item_2, string_2 },
    //...
    { item_N, string_N }
}

MethodNumberOne();
MethodNumberTwo();
MethodNumberThree();
Console.WriteLine($"{0} is displayed on the page", dict[item]);

当然,您要确保密钥(项目)有效,错误处理以及所有爵士乐。