有没有一种方法可以使枚举值无法显示为组合框
或者只是,不要从Enum.GetValues()
回来?
public enum DomainTypes
{
[Browsable(true)]
Client = 1,
[Browsable(false)]
SecretClient = 2,
}
答案 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
属性生成枚举列表。