自定义显示enum名称

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// https://stackoverflow.com/questions/7422685/edit-the-display-name-of-enumeration-members-in-a-propertygrid
// https://www.codeproject.com/articles/28087/displaynameattribute-for-enumerations

namespace PropertyGridShowEnumCustomName
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();

      propertyGrid1.SelectedObject = new Foo();
    }
  }

  public class Foo
  {
    [TypeConverter(typeof(FooTypeConverter))]
    public FooType Type { get; set; }
  }

  public enum FooType
  {
    A,
    B,
    C,
    D,
  }

  public class FooTypeConverter : EnumConverter
  {
    private Type enumType;

    public FooTypeConverter(Type type) : base(type)
    {
      enumType = type;
    }
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destType)
    {
      return destType == typeof(string);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture,
                                     object value, Type destType)
    {
      switch ((FooType)value)
      {
        case FooType.A:
          return "甲";
        case FooType.B:
          return "乙";
        case FooType.C:
          return "丙";
        case FooType.D:
          return "丁";
      }

      return "";
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type srcType)
    {
      return srcType == typeof(string);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
      //foreach (FieldInfo fi in enumType.GetFields())
      //{
      //  DescriptionAttribute dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi,
      //                              typeof(DescriptionAttribute));
      //  if ((dna != null) && ((string)value == dna.Description))
      //    return Enum.Parse(enumType, fi.Name);
      //}
      //return Enum.Parse(enumType, (string)value);
      switch ((string)value)
      {
        case "甲":
          return FooType.A;
        case "乙":
          return FooType.B;
        case "丙":
          return FooType.C;
        case "丁":
          return FooType.D;
      }

      return FooType.A;
    }
  }
}

posted on 2022-04-01 13:45  OctoberKey  阅读(35)  评论(0)    收藏  举报

导航