我想在这里实现的目标有点棘手。在开始之前,让我先介绍一下背景知识。
我知道我们可以使用枚举作为方法参数的类型。例如,我可以做这样的事情(一个非常基本的例子)
namespace Test { class DefineEnums { public enum MyEnum { value1 = 0, value2 = 1 } } class UseEnums { public void UseDefinedEnums(DefineEnums.MyEnum _enum) { //Any code here. } public void Test() { // "value1" comes here with the intellisense. UseDefinedEnums(DefineEnums.MyEnum.value1); } } }
我需要做的是创建一个动态枚举,并使用它作为类型代替上面提到的DefineEnums.MyEnum
。
我尝试了以下内容。 1.使用我从网上获得的方法从字符串列表创建动态枚举。并创建了一个我可以使用的静态类。
using System; using System.Collections.Generic; using System.Reflection; using System.Reflection.Emit; namespace Test { public static class DynamicEnum { public static Enum finished; static List<string> _lst = new List<string>(); static DynamicEnum() { _lst.Add("value1"); _lst.Add("value2"); finished = CreateDynamicEnum(_lst); } public static Enum CreateDynamicEnum(List<string> _list) { // Get the current application domain for the current thread. AppDomain currentDomain = AppDomain.CurrentDomain; // Create a dynamic assembly in the current application domain, // and allow it to be executed and saved to disk. AssemblyName aName = new AssemblyName("TempAssembly"); AssemblyBuilder ab = currentDomain.DefineDynamicAssembly( aName, AssemblyBuilderAccess.RunAndSave); // Define a dynamic module in "TempAssembly" assembly. For a single- // module assembly, the module has the same name as the assembly. ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll"); // Define a public enumeration with the name "Elevation" and an // underlying type of Integer. EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int)); // Define two members, "High" and "Low". //eb.DefineLiteral("Low", 0); //eb.DefineLiteral("High", 1); int i = 0; foreach (string item in _list) { eb.DefineLiteral(item, i); i++; } // Create the type and save the assembly. return (Enum)Activator.CreateInstance(eb.CreateType()); //ab.Save(aName.Name + ".dll"); } } }
public static void TestDynEnum(Test.DynamicEnum.finished _finished) { // Do anything here with _finished. }
我觉得这个帖子已经太长了,但我希望我已经说得很清楚了。
答案 0 :(得分:3)
你要么必须传入一个对象,要么动态创建你的方法。
我可能会问为什么你不能只使用int
?好像你必须动态创建大量代码才能将它作为枚举传递。
答案 1 :(得分:2)
在动态创建枚举时,在运行代码之前它不存在。由于您无法在编译时使用该类型,因此无法指定该类型的参数。动态创建枚举仅在您已经有一个需要某种枚举(但不是任何特定枚举类型)的方法,或者您还创建动态使用枚举的代码时才有用。
使用枚举实例可以做的基本上是获取值的字符串表示形式,将字符串解析回值,并获取已定义值的列表。使用像Dictionary<int, string>
这样的东西更容易实现。