2010-05-12 6 views
1

J'ai créé une énumération dans laquelle j'ai stocké certains noms de tables. Je veux qu'il soit utilisé pour obtenir le nom de la table comme ds.Tables[BGuestInfo.TableName.L_GUEST_TYPE.ToString()].Est-il possible de créer une énumération dont l'instance ne peut pas être créée mais qui peut être utilisée à des fins de lecture seule?

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 
} 

Ceci est mon ENUM. Maintenant, je n'ai créé aucune instance de cette énumération afin que personne ne puisse l'utiliser à d'autres fins que la lecture seule.

Pour que cette énumération soit également accessible dans les classes externes, je dois la rendre publique, ce qui signifie que certaines classes externes peuvent également créer leur objet. Alors, que puis-je faire pour limiter la création de l'instance?

+0

Pourriez-vous donner un exemple de création d'une instance d'énumération? – tafa

+0

Pourquoi voulez-vous limiter cela? –

+0

vous ne pouvez pas avoir l'instance d'une énumération, c'est un type de valeur. –

Répondre

1

Les énumérations sont des types de valeur. Vous ne pouvez pas créer d'objets/d'instances à partir d'eux. Par définition, les enums sont en lecture seule. Vous ne pouvez pas modifier les valeurs enum définies, utilisez-les uniquement.

Vous pouvez limiter la visibilité à l'aide access modifiers - vous pouvez faire le ENUM privé à votre classe:

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 pour l'erreur de frappe. Je veux dire l'instance –

+0

@Shantanu Gupta - Vous ne pouvez pas instancier les types de valeur. Ce ne sont pas des objets. C'est comme essayer d'instancier un int. – Oded

+0

sry mais je ne sais pas ce que "a.TableName x;" l'étape sera appelée. Je pense que c'est une déclaration. Je veux limiter cela. –

1

je ferais probablement quelque chose comme ceci:

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

Ceci est similaire à la " motif enum ". Vous écrivez une classe qui pourrait être utilisée comme une énumération.

Vous pouvez ajouter d'autres propriétés à la classe Table, et pas seulement le nom. Vous pouvez également placer toutes les tables dans une liste (dans le constructeur) et fournir une propriété statique pour accéder à toutes les tables. Et last but not least, si vous avez des zones différentes dans vos applications (par exemple, des modules), vous pouvez dériver la classe Table dans chaque zone afin d'ajouter des tables supplémentaires qui ne sont visibles que pour cette zone.

+0

Je cherchais les mêmes fonctionnalités. Mais essayait d'éviter de créer la classe –

+0

Si vous en profitez parce que cela vous facilite la vie dans une zone plus grande, créer une classe n'est pas un problème. –

Questions connexes