Действительно ли возможно создать перечисление, экземпляр которого не может быть создан, но может использоваться для цели только для чтения

Я создал перечисление, где я сохранил некоторые имена таблиц. Я хочу, чтобы это использовалось для получения названия таблицы как 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
}

Это - мое перечисление. Теперь я не создал экземпляра этого перечисления так, чтобы никто не мог использовать его для кроме цели только для чтения.

Чтобы это перечисление было доступно во внешних классах также, я должен сделать его общественностью, что означает, что некоторый внешний класс может создать свой объект также.

Таким образом, что я могу сделать, чтобы ограничить его создание экземпляра.

1
задан Shantanu Gupta 12 May 2010 в 09:02
поделиться

2 ответа

Перечисления - это типы значений. Вы не можете создавать из них объекты / экземпляры.

По определению, перечисления доступны только для чтения . Вы не можете изменять определенные значения перечисления, только используйте их.

Вы можете ограничить видимость, используя модификаторы доступа - вы можете сделать перечисление приватным для вашего класса:

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
ответ дан 3 September 2019 в 00:37
поделиться

Я бы, наверное, сделал что-то вроде этого:

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 в каждой области, чтобы добавить дополнительные таблицы, которые видны только в этой области.

1
ответ дан 3 September 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: