枚举值`可浏览(假)`

时间:2011-06-20 17:22:56

标签: c# enums

有没有一种方法可以使枚举值无法显示为组合框
或者只是,不要从Enum.GetValues()回来?

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

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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");
}

希望这会有所帮助。祝你好运!

答案 2 :(得分: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属性生成枚举列表。