我使用Enums查找数据库中很少更改的值 - 例如:
public enum CarTypes
{
Sedan,
HatchBack,
Saloon,
SportsCar
}
访问汽车类型:
CarTypes.Sedan
这很棒,因为当我按下“#”时,它会让我对每个选项进行智能感知。' - 并且int ID可以镜像到数据库表中(在这种情况下ID为0)。
但是,如果我需要镜像一个很少变化的具有Guid ID的数据库表 - 我仍然希望智能感知的便利性,安全性和可读性在按下'之后呈现所有可能性。' - 我有什么选择?
我试图在Bing中找到类似的东西 - 但是每个选项都使用字符串值 - 所以缺少'。' intellisense的优点(例如List,Dictionary等)。
我如何以最佳实践方式做到这一点?
答案 0 :(得分:3)
您可以创建任何类型的静态属性(Guid,string等)。这样做的缺点是所有API都围绕您选择代表这些对象的任何基础类型,虽然这很容易实现,但它有几个缺点。使用像Guid这样的不透明类型进行调试可能会更加困难。调用者需要记住给定常量的位置(可能在某个辅助类中),并且当存在多组这些常量时可能会混淆,因为它们使用相同的底层类型,因此可以偶然互换。如果需要将其他信息附加到这些类型,则通常必须通过查找关联数据的辅助方法来完成。
解决许多这些缺点的设计并不难实现。使用私有构造函数和一些表示所需对象的静态字段/属性创建一个类。
class CarTypes
{
private CarTypes(Guid id)
{
Id = id;
}
public static CarTypes Sedan { get; } = new CarTypes(Guid.Parse("6f8bdca0-2fb3-4163-884b-b75b1d20a428"));
public static CarTypes HatchBack { get; } = new CarTypes(Guid.Parse("4ad6432a-ed9d-4947-91a6-78756df51a81"));
public Guid Id { get; }
}
您还可以为ToString添加名称和/或重载,这样可以更方便地进行调试。
如果您需要从Guids或字符串转到更多工作的CarTypes,但您可以轻松地使用反射来构建为Parse方法执行此操作的查找。
这种设计的好处是,您可以围绕程序域中的对象编写API(例如CarTypes),并且您将来可以使用更多选项来发展API。如果您需要在方法中添加更多数据属性甚至行为,那么就可以这样做。