是否可以创建一个枚举,其实例无法创建但可用于只读目的

时间:2010-05-12 09:02:26

标签: c# .net enums oop instantiation

我创建了一个枚举,我存储了一些表名。我希望它用于获取表格的名称,如ds.Tables[BGuestInfo.TableName.L_GUEST_TYPE.ToString()]

public class a
{
      public enum TableName : byte
            {
                L_GUEST_TYPE = 0
                ,L_AGE_GROUP = 1
                ,M_COMPANY = 2
                ,L_COUNTRY = 3
                ,L_EYE_COLOR = 4
                ,L_GENDER = 5
                ,L_HAIR_COLOR = 6
                ,L_STATE_PROVINCE = 7
                ,L_STATUS = 8
                ,L_TITLE = 9
                ,M_TOWER = 10
                ,L_CITY = 11
                ,L_REGISTER_TYPE = 12
            }
}

class b 
{
    a.TableName x; //trying to restrict this 
    ds.Tables[a.TableName.L_GUEST_TYPE] //accessible and can be used like this
}

这是我的枚举。现在我还没有创建这个枚举的任何实例,因此没有人可以将它用于除了只读目的之外。

为了能够在外部类中访问此枚举,我必须将其公开,这意味着一些外部类也可以创建其对象。

那么我该怎样做才能限制其实例的创建。

2 个答案:

答案 0 :(得分:1)

枚举是值类型。您无法从中创建对象/实例。

根据定义,枚举只读。您不能修改定义的枚举值,只能使用它们。

您可以使用access modifiers来限制可见性 - 您可以将枚举设为您的班级的私密信息:

class b 
{
    private enum TableName : byte
    {
      L_GUEST_TYPE = 0
      ,L_AGE_GROUP = 1
      ,M_COMPANY = 2
      ,L_COUNTRY = 3
      ,L_EYE_COLOR = 4
      ,L_GENDER = 5
      ,L_HAIR_COLOR = 6
      ,L_STATE_PROVINCE = 7
      ,L_STATUS = 8
      ,L_TITLE = 9
      ,M_TOWER = 10
      ,L_CITY = 11
      ,L_REGISTER_TYPE = 12
    }

    public void myMethod(DataSet ds)
    {
      ds.Tables[TableName.L_GUEST_TYPE] //accessible and can be used like this
    }
}

答案 1 :(得分:1)

我可能会这样做:

public class Table
{
  public static readonly Company = new Table("T_Company");
  public static readonly Title = new Table("T_Title");
  public static readonly City = new Table("T_City");

  private string name;

  public string Name { get { return name; } }

  private Table(string name)
  {
    this.name = name;
  }
}

class b 
{
    // ...

    // use it like this:
    ds.Tables[Table.Company.Name];
}

这类似于“枚举模式”。你写了一个可以像枚举一样使用的类。

您可以向Table类添加其他属性,而不仅仅是Name。您还可以将所有表放入一个列表(在构造函数中)并提供一个静态属性来访问所有表。

最后但并非最不重要的是,如果您的应用程序中有不同的区域(例如模块),您可以在每个区域中派生Table类,以便添加仅对此区域可见的其他表。