110,533
社区成员
发帖
与我相关
我的任务
分享
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.propertyGrid1.SelectedObject = new My();
TypeConverter convert = new MyEnumConverter(typeof(RelationOp));
string g = convert.ConvertToInvariantString(RelationOp.Greater); // >
string e = convert.ConvertToInvariantString(RelationOp.Less); // ==
}
class My
{
public string Name { get; set; }
public RelationOp Op { get; set; }
}
[TypeConverter(typeof(MyEnumConverter))] //<---
enum RelationOp
{
[Description(">")]
Greater,
[Description("<")]
Less,
[Description("==")]
Equal,
}
class MyEnumConverter : EnumConverter
{
static Dictionary<Enum, string> DisplayNames = new Dictionary<Enum, string>();
public MyEnumConverter(Type t) : base(t)
{
if (DisplayNames.Count == 0)
{
foreach (FieldInfo fi in this.EnumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public))
{
Enum value = (Enum)fi.GetValue(null);
string display = value.ToString();
foreach(Attribute attr in fi.GetCustomAttributes(false))
{
if(attr is DescriptionAttribute)
{
display = (attr as DescriptionAttribute).Description;
break;
}
}
DisplayNames.Add(value, display);
}
}
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
foreach (Enum key in DisplayNames.Keys)
{
if (string.CompareOrdinal(DisplayNames[key], value as string) == 0) return key;
}
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string) && value is Enum)
{
if (DisplayNames.ContainsKey((Enum)value)) return DisplayNames[(Enum)value];
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
}
string[] str = new string[] { "> ", "< ", ">=", "<=" };
class Program
{
static void Main(string[] args)
{
var list = GetEnumDescription(typeof(Test));
}
public static List<KeyValuePair<int, string>> GetEnumDescription(Type enumType)
{
var descriptions = new List<KeyValuePair<int, string>>();
FieldInfo[] fis = enumType.GetFields();
foreach (var fi in fis)
{
if (fi.FieldType == typeof(Int32)) continue;
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.
GetCustomAttributes(typeof(DescriptionAttribute), false);
int key = (int)fi.GetValue(null);
string desc = (attributes.Length > 0) ? attributes[0].Description : fi.Name;
descriptions.Add(new KeyValuePair<int, string>(key, desc));
}
return descriptions;
}
}
public enum Test
{
[Description(">")]
A,
B,
C
}
public class RelationOpert
{
public const string Great = ">";
public const string Less = "<";
public const string GreatEqual = ">=";
...
}