Значение перечисления `Browsable (false)` - PullRequest
4 голосов
/ 20 июня 2011

есть ли способ сделать значение перечисления недоступным для просмотра в поле со списком
или просто не возвращаться из Enum.GetValues() ??

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

Ответы [ 3 ]

5 голосов
/ 28 мая 2013

Это общий метод (основанный на другом 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 голос
/ 20 июня 2011

Уже нет ничего, что можно сделать для вас методом 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 голос
/ 20 июня 2011

Это действительно не может быть сделано в 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");
}

Надеюсь, это поможет. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...