1

我有一个具有两个属性的对象:TextType.

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

但是,我现在想运行一个实用程序方法来清理Text基于对象Type所在的对象字段(例如,如果它是 URL,则添加“http://”)。

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

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

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

有一个更好的方法吗?

4

5 回答 5

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;
}

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

于 2011-09-26T10:54:22.497 回答
3

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

于 2011-09-26T10:55:29.307 回答
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的类。

于 2011-09-26T10:57:11.680 回答
0

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

但是将它们放在数据库中如何使其可扩展?

于 2011-09-26T10:59:31.043 回答
0

正如 Oded 所说,使用枚举:

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

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

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

希望有帮助

于 2011-09-26T11:00:09.650 回答