using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProductionControl.Utils
{
public static class EnumUtil
{
///
/// 动态创建枚举
///
/// 枚举元素列表
/// 枚举名
/// Enum枚举
public static Enum CreateEnum(Dictionary enumDictionary, string enumName = "DefalutEnum")
{
if (enumDictionary == null || enumDictionary.Count <= 0)
return null;
AppDomain currentDomain = AppDomain.CurrentDomain;
AssemblyName aName = new AssemblyName("TempAssembly");
AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
if (string.IsNullOrWhiteSpace(enumName))
{
enumName = "DefalutEnum";
}
EnumBuilder eb = mb.DefineEnum(enumName, TypeAttributes.Public, typeof(int));
foreach (var item in enumDictionary)
{
eb.DefineLiteral(item.Key, item.Value);
}
Type finished = eb.CreateType();
return (Enum)Enum.Parse(finished, enumName);
//ab.Save(aName.Name + ".dll");
//Enum.GetValues(finished)
//Enum eEnum = System.Reflection(finished) as Enum;
//foreach (object item in Enum.GetValues(eEnum.GetType()))
//{
// Debug.LogError(string.Format("{0}.{1} = {2}", finished, item, ((int)item)));
//}
//return eEnum;
}
///
/// 动态创建枚举
///
/// 枚举元素列表
/// 枚举名
/// Enum枚举
public static Enum CreateEnum(List enumList, string enumName = "DefalutEnum")
{
if (enumList == null || enumList.Count <= 0)
return null;
AppDomain currentDomain = AppDomain.CurrentDomain;
AssemblyName aName = new AssemblyName("TempAssembly");
AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
if (string.IsNullOrWhiteSpace(enumName))
{
enumName = "DefalutEnum";
}
EnumBuilder eb = mb.DefineEnum(enumName, TypeAttributes.Public, typeof(int));
for (int i = 0; i < enumList.Count; i++)
{
eb.DefineLiteral(enumList[i], i);
}
Type finished = eb.CreateType();
return (Enum)Enum.Parse(finished, enumName);
//Enum eEnum = Reflection.GetDefault(finished) as Enum;
//foreach (object item in Enum.GetValues(eEnum.GetType()))
//{
// Debug.LogError(string.Format("{0}.{1} = {2}", finished, item, ((int)item)));
//}
//return eEnum;
}
///
/// 根据枚举的值获取枚举名称
///
/// 枚举类型
/// 枚举的值
///
public static string GetEnumName(this int status)
{
return Enum.GetName(typeof(T), status);
}
///
/// 获取枚举名称集合
///
///
///
public static string[] GetNamesArr()
{
return Enum.GetNames(typeof(T));
}
///
/// 将枚举转换成字典集合
///
/// 枚举类型
///
public static Dictionary getDic()
{
Dictionary resultList = new Dictionary();
Type type = typeof(T);
//var strList = GetNamesArr().ToList();
//foreach (string key in strList)
//{
// string val = Enum.Format(type, Enum.Parse(type, key), "d");
// resultList.Add(key, int.Parse(val));
//}
foreach (int value in Enum.GetValues(type))
{
string strName = Enum.GetName(type, value);//获取名称
//string strVaule = value.ToString();//获取值
resultList.Add(strName, value);
}
return resultList;
}
///
/// 将枚举转换成字典
///
///
///
public static Dictionary getDic2()
{
Dictionary dic = new Dictionary();
Type t = typeof(TEnum);
var arr = Enum.GetValues(t);
foreach (var item in arr)
{
dic.Add(item.ToString(), (int)item);
}
return dic;
}
public static ArrayList GetArrayList()
{
ArrayList list = new ArrayList();
Type type = typeof(T);
//list.Add(new DictionaryEntry("start", "启动按钮"));
foreach (int value in Enum.GetValues(type))
{
string strName = Enum.GetName(type, value);//获取名称
list.Add(new DictionaryEntry(value, strName));
}
return list;
}
///
/// 通过Enum的名称转为Enum类型
///
///
///
///
public static T Convert2Enum(string codeName)
{
T myEnum = (T)Enum.Parse(typeof(T), codeName);
return myEnum;
}
#region 绑定到ComboBox
///
/// 绑定ComboBoxEx数据源到枚举类型
///
///
///
///
public static void BindToEnumName(ComboBox cmb, Type enumType, T value)
{
cmb.DataSource = Enum.GetNames(enumType);
if(value!=null)
SetSelectedItemToEnum(cmb, value);
}
///
/// 获取选择项
///
///
///
///
public static T GetSelectedItemToEnum(this ComboBox cmb)
{
return (T)Enum.Parse(typeof(T), cmb.SelectedItem.ToString(), false);
}
///
/// 设置选定项
///
///
///
///
public static void SetSelectedItemToEnum(this ComboBox cmb, T t)
{
cmb.SelectedItem = t.ToString();
}
#endregion
}
}