Using dynamic enum as type in a parameter of a method
我想在这里实现的有点棘手。在开始之前,让我先简要介绍一下背景。
我知道我们可以使用枚举作为方法参数的类型。例如,我可以这样做(一个非常基本的例子)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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); } } } |
我需要做的是创建一个动态枚举,并将其作为类型来代替上面提到的
我尝试了以下方法。1。使用从网络中获得的方法从字符串列表中创建动态枚举。并创建了一个我可以使用的静态类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | 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"); } } } |
1 2 3 4 | public static void TestDynEnum(Test.DynamicEnum.finished _finished) { // Do anything here with _finished. } |
我想这篇文章写得太长了,但我希望我已经讲清楚了。
您要么必须传入一个对象,要么动态地创建方法。
我能问一下为什么你不能只用一个
当您动态创建枚举时,它直到您运行代码才存在。由于不能在编译时使用该类型,因此不能指定该类型的参数。动态创建枚举只有在您已经有一个方法需要某种类型的枚举(但不是任何特定的枚举类型)或者您还创建了动态使用枚举的代码时才有用。
使用枚举实例可以做的基本上是获取值的字符串表示形式,将字符串解析回值,并获取定义值的列表。这对于像