代码之家  ›  专栏  ›  技术社区  ›  niico

类似于枚举的查找,但基于guid,但仍具有IntelliSense便利性/安全性/可读性[关闭]

c#
  •  -1
  • niico  · 技术社区  · 8 年前

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

    public enum CarTypes
    {
        Sedan,
        HatchBack,
        Saloon,
        SportsCar
    }
    

    要访问汽车类型:

    CarTypes.Sedan
    

    这很好,因为当我按“”时,它能让我对每个选项都有一种智能感知,而且int id可以镜像到数据库表中(在本例中,id为0)。

    但是,如果我需要镜像一个具有guid id的很少更改的数据库表,并且我仍然希望在按下“”后,能够以所有可能的方式显示智能感知的便利性、安全性和可读性-我的选项是什么?

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

    我如何才能以最佳实践的方式做到这一点?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Mike Zboray    8 年前

    您可以创建任何类型的静态属性(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添加一个名称和/或重载,这样更便于调试。

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

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