避免在switch语句中使用硬编码

时间:2011-09-26 10:51:47

标签: c# if-statement switch-statement hard-coding

我的对象有两个属性:TextType

为了避免对类型进行硬编码,我将它们放在数据库中,以便将来可以添加它们。目前类型为URL, Username and ID

但是,我现在想要运行一个Utility方法来根据对象Text来清理对象的Type字段(例如,如果是URL,则添加'http://')。

有没有办法在Utilities类中执行此操作,而无需对switch语句/ if else块中的类型进行硬编码。

switch (type)
{
    case 1:
        TidyUrl();
    case 2:
        TidyUsername();
    case 3:
        TidyID();
    default:
        break;
}

在这个例子中,我正在硬编码来自数据库的ID('Type'表),这永远不是一件好事!

有更好的方法吗?

5 个答案:

答案 0 :(得分:4)

您可以使用枚举来帮助提高可读性。

enum MyTypes
{
 URL = 1,
 UserName = 2,
 Id = 3,
}

switch (myType)
{
    case MyTypes.URL:
        TidyUrl();
    case MyTypes.UserName:
        TidyUsername();
    case MyTypes.Id:
        TidyID();
    default:
        break;
}

此枚举需要与数据库保持协调。

答案 1 :(得分:3)

一种方法是使用多态。对于每个“类型”,您都有单独的类,并且它们使用类似Tidy的方法实现公共接口(或具有公共基类),其中每个类都有自己的逻辑。

答案 2 :(得分:2)

传统上,这是使用通用接口处理,并动态构建具体实现来完成实际工作。

例如:

public interface ITidy
{
   string Tidy(string input);
}

然后是实现

public class UrlTidy : ITidy
{
    public string Tidy(string input)
    {
        // do whatever you need to the url
    }
}

等等其他类型的整理。现在,您需要一种从您正在查看的类型中实例化正确的具体类(UrlTidyIdTidy等)的方法。实现此目的的一种方法可能是将类名放在数据库中,并使用反射来实例化ITidy的正确实现。另一个问题是使用Factory类,它使用其他方法根据类型实例化右ITidy

答案 3 :(得分:0)

您可以使用enum Type但是它们的常量值必须在编译时确定。您可以在enum中进行类不变性检查,以确保它与数据库一致。

但是如何让它们在数据库中使它可以扩展?

答案 4 :(得分:0)

正如Oded所说,使用枚举:

public enum Types
{
    Type1 = 1,
    Type2 = 2,
    Type3 = 3
}

然后,您可以将类型变量强制转换为枚举,将整数映射到数据库ID:

switch ((Types)type)
{
    case Types.Type1:
        break;
    case Types.Type2:
        break;
    ...
}

希望有所帮助