使这个代码片段更好

本文关键字:片段 更好 代码 | 更新日期: 2023-09-27 17:50:30

我有一个程序,它有以下代码:

foreach (string section in DataAccessLayer.AcceptedSections)
{
    switch (section)
    {
        case "Section1":
            Console.WriteLine("Section 1");
            break;
        case "Section2":
            Console.WriteLine("Section 2");
            break;
        case "Section3":
            Console.WriteLine("Section 3");
            break;
        default:
            Console.WriteLine("Default section");
            break;
    }                    
}

无论如何,我可以做什么这段代码不提供节的字符串再次在情况下?数据访问层。AcceptedSections是动态的,我不想在我的代码中添加另一个section case,每次有新section出现时都要重新构建和重新部署。今天是星期五,我脑子不太好使。

例如

: 当第4节添加到数据库中时,我不想添加以下代码:

case "Section4":
    Console.WriteLine("Section 4");
     break;

使这个代码片段更好

如果字符串总是"SectionN",您可以直接处理它:

if (section.StartsWith("Section"))
    Console.WriteLine(section.Insert(7, " "));
else
    Console.WriteLine("Default Section");

有一个由section键控的Dictionary<string,Action<T>>。这将完全取代switch语句。

调用相应的操作:

foreach (string section in DataAccessLayer.AcceptedSections)
{
    myActionsDictionary[section]();
}

如果这都是数据驱动的,我建议你从数据库返回一些其他显示值以及标识符字符串

<<p>表strong> AcceptedSections
Name = "Section1"
DisplayName = "Section 1"

那么你可以直接返回DisplayName


如果不是,你必须像现在这样处理它,或者你可以创建一个带有display属性的enum:

public enum AcceptedSections
{
    [Description("Default Section")]
    Default,
    [Description("Section 1")]
    Section1,
    [Description("Section 2")]
    Section2,
    [Description("Section 3")]
    Section3,
    [Description("Section 4")]
    Section4
}
// writing this made me kind woozy... what a terrible enum

允许你这样写:

foreach (AcceptedSections section in AcceptedSections.GetValues())
{
    Console.WriteLine(section.GetDescription());
}

其中GetDescription()是一个简单的方法,返回enum

上的自定义属性