是否有可能创建其实例不能创建但可用于只读目的的枚举

问题描述:

我创建了一个枚举,其中存储了一些表名。我希望它被用来获得像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 
} 

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

为了让这个枚举可以在外部类中访问,我必须将它公开,这意味着某些外部类也可以创建它的对象。

那么我能做些什么来限制它的实例创建。

+0

您可以举一个枚举实例如何创建的例子吗? – tafa 2010-05-12 09:11:10

+0

你为什么要限制这个? – 2010-05-12 09:20:18

+0

你不能拥有一个枚举的实例,它是一个值类型。 – 2010-05-13 05:03:17

枚举值类型。你不能从它们创建对象/实例。

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

您可以通过使用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 
    } 
} 
+0

sry for mistyping。我的意思是实例 – 2010-05-12 09:06:20

+0

@Shantanu Gupta - 你不能实例化值类型。它们不是物体。这就像试图实例化一个int。 – Oded 2010-05-12 09:08:13

+0

sry但我不知道什么“a.TableName x”步骤将被调用。我认为这是宣言。我想限制这一点。 – 2010-05-12 09:10:11

我可能会做这样的事情:

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类中,而不仅仅是名称。您也可以将所有表放入列表中(在构造函数中),并提供一个静态属性来访问所有表。最后但并非最不重要,如果您的应用程序中有不同的区域(例如模块),则可以在每个区域中派生Table类,以添加仅对此区域可见的其他表。

+0

我正在寻找相同的功能。但是试图避免创建类 – 2010-05-12 09:19:17

+0

如果你从中受益,因为它可以让你的生活在更大的区域更轻松,创建一个班级不是问题。 – 2010-05-12 10:24:38