C# 查找类似于枚举,但基于Guid,但仍具有intellisense便利性/安全性/可读性

C# 查找类似于枚举,但基于Guid,但仍具有intellisense便利性/安全性/可读性,c#,C#,我使用枚举查找数据库中很少更改的值-例如: public enum CarTypes { Sedan, HatchBack, Saloon, SportsCar } 要访问汽车类型,请执行以下操作: CarTypes.Sedan 这很好,因为当我按下“.”时,它让我对每个选项都有了智能感知——并且int-ID可以镜像到数据库表中(本例中的ID为0) 但是,如果我需要镜像一个具有Guid ID的很少更改的数据库表,并且我仍然希望在按“.”后显示所有可能性的int

我使用枚举查找数据库中很少更改的值-例如:

public enum CarTypes
{
    Sedan,
    HatchBack,
    Saloon,
    SportsCar
}
要访问汽车类型,请执行以下操作:

CarTypes.Sedan
这很好,因为当我按下“.”时,它让我对每个选项都有了智能感知——并且int-ID可以镜像到数据库表中(本例中的ID为0)

但是,如果我需要镜像一个具有Guid ID的很少更改的数据库表,并且我仍然希望在按“.”后显示所有可能性的intellisense便利性、安全性和可读性,那么我的选项是什么

我曾试图在Bing中找到类似的东西,但每个选项都使用字符串值,因此缺少“.”智能感知优势(如列表、字典等)


如何以最佳实践方式实现这一点?

您可以创建任何类型的静态属性(Guid、字符串等)。这样做的缺点是,所有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添加一个名称和/或重载,这将更便于调试

如果您需要从guid或字符串转到CarTypes,这需要做更多的工作,但是您可以轻松地使用反射来构建一个查找,为解析方法实现这一点


这种设计的好处是,您可以围绕程序域中的对象(例如,CarTypes)编写API,并且您将来可以有更多的选项来改进API。如果您需要在方法中添加更多数据属性甚至行为,您可以这样做。

唯一的选择是让一个静态类充满静态只读/const字段创建一个静态类
CarTypes
。在中,为您需要的每个GUID值/常量创建公共静态只读字段。这就是我所想的-这是“最佳实践”吗?有问题吗?思想?我想这样做是错的吗?它似乎有很多优点,不是吗?这不是一个真正的问题,除非您希望以某种人类可读的格式(比如JSON)序列化,并且希望按名称而不是值序列化“Enum”值。但是,再一次,这通常只是一个“化妆品问题”。<代码>但是,如果我需要镜像一个很少改变的数据库表,它有GUID ID >考虑将一个新的唯一(int)列添加到可用于查找的数据库表中。然后使用枚举。