81 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.ComponentModel;
 | ||
| using System.Globalization;
 | ||
| using System.Linq;
 | ||
| using System.Reflection;
 | ||
| using System.Text;
 | ||
| using System.Threading.Tasks;
 | ||
| 
 | ||
| namespace Check.Main.Common
 | ||
| {
 | ||
|     /// <summary>
 | ||
|     /// 一个自定义的类型转换器,用于让PropertyGrid等控件显示枚举成员的Description特性,而不是成员名。
 | ||
|     /// </summary>
 | ||
|     public class EnumDescriptionTypeConverter : EnumConverter
 | ||
|     {
 | ||
|         /// <summary>
 | ||
|         /// 构造函数,传入枚举类型。
 | ||
|         /// </summary>
 | ||
|         /// <param name="type">要进行转换的枚举类型。</param>
 | ||
|         public EnumDescriptionTypeConverter(Type type) : base(type)
 | ||
|         {
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 重写此方法,将枚举值转换为其描述文本。
 | ||
|         /// 这是从 "数据" -> "UI显示" 的过程。
 | ||
|         /// </summary>
 | ||
|         public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
 | ||
|         {
 | ||
|             // 如果目标类型是字符串,并且我们有一个有效的枚举值
 | ||
|             if (destinationType == typeof(string) && value != null)
 | ||
|             {
 | ||
|                 // 获取枚举值的字段信息
 | ||
|                 FieldInfo fi = value.GetType().GetField(value.ToString());
 | ||
|                 if (fi != null)
 | ||
|                 {
 | ||
|                     // 查找该字段上的DescriptionAttribute
 | ||
|                     var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
 | ||
| 
 | ||
|                     // 如果找到了Description特性,就返回它的描述文本;否则,返回基类的默认行为(即成员名)
 | ||
|                     return ((attributes.Length > 0) && (!String.IsNullOrEmpty(attributes[0].Description)))
 | ||
|                            ? attributes[0].Description
 | ||
|                            : value.ToString();
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // 对于其他所有情况,使用基类的默认转换逻辑
 | ||
|             return base.ConvertTo(context, culture, value, destinationType);
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 重写此方法,将描述文本转换回其对应的枚举值。
 | ||
|         /// 这是从 "UI显示" -> "数据" 的过程。
 | ||
|         /// </summary>
 | ||
|         public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
 | ||
|         {
 | ||
|             // 如果传入的值是字符串
 | ||
|             if (value is string)
 | ||
|             {
 | ||
|                 // 遍历枚举类型的所有成员
 | ||
|                 foreach (FieldInfo fi in EnumType.GetFields())
 | ||
|                 {
 | ||
|                     // 查找该成员上的DescriptionAttribute
 | ||
|                     var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
 | ||
| 
 | ||
|                     // 如果找到了Description,并且它的描述文本与传入的字符串匹配
 | ||
|                     if ((attributes.Length > 0) && (attributes[0].Description == (string)value))
 | ||
|                     {
 | ||
|                         // 返回这个字段(成员)对应的枚举值
 | ||
|                         return Enum.Parse(EnumType, fi.Name);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // 如果没有找到匹配的描述,或者传入的不是字符串,使用基类的默认转换逻辑
 | ||
|             return base.ConvertFrom(context, culture, value);
 | ||
|         }
 | ||
|     }
 | ||
| }
 |