C# 创建一个类似于“枚举”的枚举;名称“;类的性质

C# 创建一个类似于“枚举”的枚举;名称“;类的性质,c#,enums,renaming,C#,Enums,Renaming,我们的团队一直在缓慢地重构代码,以实现可靠的实践并实施更好的命名约定。我们遇到了一个问题,我们有一个枚举,它当前的名称与我们需要创建的另一个类的名称相同--“Department” 现在,我们有一个代表不同部门的枚举,例如: Department.HumanResource Department.InformationTechnology if (department.Name == "Information Technology") 这使我们能够使用该枚举在以下情况下基于友好名称而不是基础

我们的团队一直在缓慢地重构代码,以实现可靠的实践并实施更好的命名约定。我们遇到了一个问题,我们有一个枚举,它当前的名称与我们需要创建的另一个类的名称相同--“Department”

现在,我们有一个代表不同部门的枚举,例如:

Department.HumanResource
Department.InformationTechnology
if (department.Name == "Information Technology")
这使我们能够使用该枚举在以下情况下基于友好名称而不是基础整数ID快速引用部门:

Employee.IsInDepartment(Department.InformationTechnology)
它不是一个“类型”或“状态”或类似的名称枚举的常用方法。我们认为可能类似于“DepartmentName”,但这感觉有点奇怪,因为department类将具有“Name”属性,并且这个枚举也应该是department类的属性

我意识到命名是主观的,所以我想提出以下问题:

我们是否从错误的角度看待这个问题?有没有其他我们忽略的方法来实现这一点?

在所有这些情况下(它会弹出很多,尽管您的示例存在极大的缺陷),我通常将枚举命名为
类型
,或者在您的情况下命名为
部门类型
。可以争论它是否100%正确,但它很容易理解这一点


至于为什么这是有缺陷的,实际的部门列表应该来自数据库,因为这个列表会随着时间的推移而变化。您不希望每次在企业中添加新部门时都继续重新编译您的项目。

很抱歉,这是DepartmentType,也是命名约定中的最佳实践方法无论您喜欢与否,您都有一个具体的类,如果要遵循最佳实践,必须将其命名为department,这就给我们留下了enum,它必须是DepartmentType,遵循命名约定中的最佳实践,因此,既然您同时需要类和enum,我将这样实现它:

Employee.IsInDepartment(Department.InformationTechnology)
创建枚举:

public enum DepartmentType {IT, HR,..... }
在Department类中,还将该枚举添加为属性:

public Class Department
{
  public Name {get;set;}
  .
  .
  .

  public DepartmentType {get;set;}

}
现在,无论您是否有department对象,或者希望在任何方法中将其作为普通对象使用,都可以使用DepartmentType枚举

编辑

另一种方法是去掉枚举并在Department类中创建静态int值:

   public class Department
    {
       Public string Name {get;set;}
       ...
       ...
       ...
       public static readonly int IT = 1;
       public static readonly int HR = 2;
     }

因此,现在您可以将其用作
部门.it
部门.HR
,。。。。。不需要实例化Department类的对象,简而言之,它的用法与Enum类似。

这取决于它。使用
enum
,您希望实现什么?如果您希望在不考虑部门名称的情况下关闭不同的部门类型,那么使用
enum DepartmentType
非常有意义。例如:

Department.HumanResource
Department.InformationTechnology
if (department.Name == "Information Technology")
如果您的IT部门名称已更改,但您仍希望对该部门执行相同的操作,则情况可能会很糟。但是,

if (department.Type == DepartmentType.InformationTechnology)
不在乎部门的名称;只要它代表一个it部门,您的应用程序仍然可以工作

另外,正如其他答案中提到的,如果您希望唯一地标识一个部门,那么您确实希望使用它的主键。通过将
静态只读
字段分配给类,您仍然可以获得代码的可读性:

public static readonly int InformationTechnology = 1;
public class Department
{

     //Property to hold the department ID
     public int DepartmentID{ get; set; }

     public const int HumanResources = 1;
     public const int InformationTechnology = 2;
     //And so on..

}
它允许您访问ID,而无需显式引用号码:

if (department.Id = Department.InformationTechnology)

尽管这种方法的缺点是,如果要继续检查而不使用幻数,则在添加新的
Id
时仍必须重新编译代码。

在类中使用常量:

public static readonly int InformationTechnology = 1;
public class Department
{

     //Property to hold the department ID
     public int DepartmentID{ get; set; }

     public const int HumanResources = 1;
     public const int InformationTechnology = 2;
     //And so on..

}
然后,如果Employee.IsInDepartment需要int,则可以使用:

Employee.IsInDepartment(Department.HumanResources)...

既然你提到想要让“EnUM”是函数类的表示(但不一定每次使用引用时都加载了类的数据),那么你可以考虑这样的方法。它将使代码感觉像一个枚举,功能像一个类,但在需要属性之前,不会不必要地访问数据存储来填充属性

public class Department
{
  public int ID { get; private set; }

  //follow this pattern for property values that need to be populated from a data store.
  private string name;
  public string Name
  {
     get{ EnsureLoad(); return name; }
     set{ EnsureLoad(); name = value; }
  }

  public static Department HR{ get{ return GetEmptyDepartment( 1 ); } }
  public static Department IT{ get{ return GetEmptyDepartment( 2 ); } }

  private static Department GetEmptyDepartment(int departmentId)
  {
       return new Department()
       {
           ID = departmentId
       };
  }

  private void EnsureLoad()
  {
     //if not loaded
     //lazy load properties using the ID property against the data store.
  }
}

事实上,在我看来,这确实像是一个部门类型。你的问题被否决了,因为标题实际上没有反映你的问题,你的问题可能会更清楚。请尝试“创建一个类似于名称属性的枚举”,并更简洁地表达您的问题。看看Microsoft如何使用System.Drawing.KnownColor和System.Drawing.Color.FromKnownColor解决此问题。在整个.NET框架中,我在许多地方都看到了这一点。这可能会引发一些想法:)看看我编辑过的答案…@Kjata30:在更改了我的问题后,我完全忘了给这个问题重新命名(因为只是命名的主观性)。谢谢你指出这一点。我将重新命名这个问题——我的道歉!后一段似乎是一种假设。如果OP知道部门不太可能频繁更改,那么通过传入枚举值和字符串(实际上可能是无限范围的无效值),代码实际上更具可读性、可发现性,并且可能更不容易出错。它不是字符串,而是整数键,在departments表中插入外键。这在可读性和可发现性方面会更糟。第二部门是什么意思?你不知道!“HR”是什么意思?您可能知道,但不能保证它是一个有效值(例如,您可能指的是“人力资源”),如果不知道数据库中的可用选项,您无法确定什么是有效的。相比之下,Department.HumanResources的含义马上就很清楚了,而且通过intellisense for the enum很容易知道可用的有效选项是什么。实际上,我可以查找并询问任何人Department 5020是什么,它在我们的工资单上。在我们所有的数据库,报告,一切。关于您的枚举值,我不能说太多。如果我作为贵公司的一名新开发人员,对您的业务和代码不熟悉(或者如果我的内存很差,我知道),我不知道5020是什么意思。我还是不知道