我的对象有两个属性:Text
和Type
。
为了避免对类型进行硬编码,我将它们放在数据库中,以便将来可以添加它们。目前类型为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'表),这永远不是一件好事!
有更好的方法吗?
答案 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
}
}
等等其他类型的整理。现在,您需要一种从您正在查看的类型中实例化正确的具体类(UrlTidy
,IdTidy
等)的方法。实现此目的的一种方法可能是将类名放在数据库中,并使用反射来实例化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;
...
}
希望有所帮助