代码之家  ›  专栏  ›  技术社区  ›  Shantanu Gupta

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

  •  1
  • Shantanu Gupta  · 技术社区  · 15 年前

    我创建了一个枚举,在其中存储了一些表名。我想用它来得到桌子的名字 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 回复  |  直到 15 年前
        1
  •  1
  •   Oded    15 年前

    枚举是值类型。不能从中创建对象/实例。

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

    您可以使用 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
        }
    }
    
        2
  •  1
  •   Stefan Steinegger    15 年前

    我可能会这样做:

    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];
    }
    

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

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

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