2011-06-20 4 views
4

には、コンボボックスを参照できない列挙型の値を作る方法があります
またはEnum.GetValues()から戻らないようにしていますか?Enum値 `Browsable(false)`

public enum DomainTypes 
{ 
    [Browsable(true)] 
    Client = 1, 
    [Browsable(false)] 
    SecretClient = 2,  
} 
+4

表示する値を取得するためにラッパーを作成しないのはなぜですか。 –

+1

@ルイス:あなたは質問で質問に答えていたはずです。 ;) – Sung

答えて

1

Enum.GetValues()メソッドでこれを行うには、何も実行されていません。あなたは、属性を使用したい場合は、独自のカスタム属性を作成することができますし、反射を経て、それを使用します。

public class BrowsableAttribute : Attribute 
{ 
    public bool IsBrowsable { get; protected set; } 
    public BrowsableAttribute(bool isBrowsable) 
    { 
    this.IsBrowsable = isBrowsable; 
    } 
} 

public enum DomainTypes 
{ 
    [Browsable(true)] 
    Client = 1, 
    [Browsable(false)] 
    SecretClient = 2,  
} 

をそして、あなたは、カスタム属性をチェックし、Browsable属性に基づいて列挙型のリストを生成するためにリフレクションを使用することができます。

1

本当にC#では実行できません。パブリック列挙はすべてのメンバーを公開します。その代わりに、項目を選択的に隠す/公開するためにラッパー・クラスを使用することを検討してください。おそらく次のようなものでしょう:

public sealed class EnumWrapper 
{ 
    private int _value; 
    private string _name; 

    private EnumWrapper(int value, string name) 
    { 
     _value = value; 
     _name = name; 
    } 

    public override string ToString() 
    { 
     return _name; 
    } 

    // Allow visibility to only the items you want to 
    public static EnumWrapper Client = new EnumWrapper(0, "Client"); 
    public static EnumWrapper AnotherClient= new EnumWrapper(1, "AnotherClient"); 

    // The internal keyword makes it only visible internally 
    internal static readonly EnumWrapper SecretClient= new EnumWrapper(-1, "SecretClient"); 
} 

希望します。がんばろう!

5

これは任意の列挙型で呼び出すことができる一般的な方法です(見つけられない別のSO回答に基づいています)。 ところで、Browsable属性はSystem.ComponentModelで既に定義されています。 例:

ComboBox.DataSource = EnumList.Of<DomainTypes>(); 

... 

public class EnumList 
{ 
    public static List<T> Of<T>() 
    { 
     return Enum.GetValues(typeof(T)) 
      .Cast<T>() 
      .Where(x => 
       { 
        BrowsableAttribute attribute = typeof(T) 
         .GetField(Enum.GetName(typeof(T), x)) 
         .GetCustomAttributes(typeof(BrowsableAttribute),false) 
         .FirstOrDefault() as BrowsableAttribute; 
        return attribute == null || attribute.Browsable == true; 
       } 
      ) 
     .ToList(); 
    } 
} 
関連する問題