Files
barcodeManager/LibShapes/Core/Shape/EnumConverter.cs
2026-01-24 08:45:54 +08:00

208 lines
6.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Io.Github.Kerwinxu.LibShapes.Core.Shape
{
/// <summary>
/// 枚举转换器
/// 用此类之前必须保证在枚举项中定义了Description
/// </summary>
public class EnumConverter : ExpandableObjectConverter
{
/// <summary>
/// 枚举项集合
/// </summary>
Dictionary<object, string> dic;
/// <summary>
/// 构造函数
/// </summary>
public EnumConverter()
{
dic = new Dictionary<object, string>();
}
/// <summary>
/// 加载枚举项集合
/// </summary>
/// <param name="context"></param>
private void LoadDic(ITypeDescriptorContext context)
{
dic = GetEnumValueDesDic(context.PropertyDescriptor.PropertyType);
}
/// <summary>
/// 是否可从来源转换
/// </summary>
/// <param name="context"></param>
/// <param name="sourceType"></param>
/// <returns></returns>
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
/// <summary>
/// 从来源转换
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <returns></returns>
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
//如果是枚举
if (context.PropertyDescriptor.PropertyType.IsEnum)
{
if (dic.Count <= 0)
LoadDic(context);
if (dic.Values.Contains(value.ToString()))
{
foreach (object obj in dic.Keys)
{
if (dic[obj] == value.ToString())
{
return obj;
}
}
}
}
}
return base.ConvertFrom(context, culture, value);
}
/// <summary>
/// 是否可转换
/// </summary>
/// <param name="context"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return true;
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//ListAttribute listAttribute = (ListAttribute)context.PropertyDescriptor.Attributes[typeof(ListAttribute)];
//StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(listAttribute._lst);
//Dictionary<object, string> dic = GetEnumValueDesDic(typeof(PKGenerator));
//StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(dic.Keys);
if (dic == null || dic.Count <= 0)
LoadDic(context);
StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(dic.Keys);
return vals;
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <param name="destinationType"></param>
/// <returns></returns>
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
//DescriptionAttribute.GetCustomAttribute(
//EnumDescription
//List<KeyValuePair<Enum, string>> mList = UserCombox.ToListForBind(value.GetType());
//foreach (KeyValuePair<Enum, string> mItem in mList)
//{
// if (mItem.Key.Equals(value))
// {
// return mItem.Value;
// }
//}
//return "Error!";
//绑定控件
// FieldInfo fieldinfo = value.GetType().GetField(value.ToString());
//Object[] objs = fieldinfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
//if (objs == null || objs.Length == 0)
//{
// return value.ToString();
//}
//else
//{
// System.ComponentModel.DescriptionAttribute da = (System.ComponentModel.DescriptionAttribute)objs[0];
// return da.Description;
//}
if (dic.Count <= 0)
LoadDic(context);
foreach (object key in dic.Keys)
{
if (key.ToString() == value.ToString() || dic[key] == value.ToString())
{
return dic[key].ToString();
}
}
return base.ConvertTo(context, culture, value, destinationType);
}
/// <summary>
/// 记载枚举的值+描述
/// </summary>
/// <param name="enumType"></param>
/// <returns></returns>
public Dictionary<object, string> GetEnumValueDesDic(Type enumType)
{
Dictionary<object, string> dic = new Dictionary<object, string>();
FieldInfo[] fieldinfos = enumType.GetFields();
foreach (FieldInfo field in fieldinfos)
{
if (field.FieldType.IsEnum)
{
Object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (objs.Length > 0)
{
dic.Add(Enum.Parse(enumType, field.Name), ((DescriptionAttribute)objs[0]).Description);
}
}
}
return dic;
}
}
}