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 } }