208 lines
6.9 KiB
C#
208 lines
6.9 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|