首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#枚举及控件属性有关问题

2013-10-11 
C#枚举及控件属性问题 先说目的:要求控件的属性是下拉列表框(拿字符串做例子)这样的是可以:public partial

C#枚举及控件属性问题
 
先说目的:  要求控件的属性是下拉列表框(拿字符串做例子)

这样的是可以:   
 public partial class ViewItem : UserControl
    {      
   private RelationOpert relations;

        public RelationOpert Relations
        {
            get { return relations; }
            set { relations = value; }
        }
    }

    public enum RelationOpert
    {
        Top = 0,
        Left = 1,
        Bottom = 2,
        Right = 3
    }


可是我枚举特殊

 public enum RelationOpert
    {
        > 0,
        < ,
        >=,
        <=
    }

该怎么办啊,谢谢高手指点。



[解决办法]
特殊字符,编译都通不过。当然不可能。

写到枚举的Description里,用反射取出来还能实现。
[解决办法]
foreach (FieldInfo field in typeof(RelationOpert).GetFields(BindingFlags.Public 
[解决办法]
 BindingFlags.Static))
                    {
                        object[] atts = field.GetCustomAttributes(typeof(DescriptionAttribute), true);
...
}
[解决办法]

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 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);
        }
    }
}

热点排行