关于c#:在方法的参数中使用动态枚举作为类型


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

我需要做的是创建一个动态枚举,并将其作为类型来代替上面提到的DefineEnums.MyEnum

我尝试了以下方法。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");


        }
    }
}
  • 尝试使用类,但找不到上面定义的"finished"枚举。即,我无法执行以下操作
  • 1
    2
    3
    4
            public static void TestDynEnum(Test.DynamicEnum.finished _finished)
            {
                // Do anything here with _finished.
            }

    我想这篇文章写得太长了,但我希望我已经讲清楚了。


    您要么必须传入一个对象,要么动态地创建方法。

    我能问一下为什么你不能只用一个int来做这个吗?似乎您必须动态地创建大量代码才能将其作为枚举传递。


    当您动态创建枚举时,它直到您运行代码才存在。由于不能在编译时使用该类型,因此不能指定该类型的参数。动态创建枚举只有在您已经有一个方法需要某种类型的枚举(但不是任何特定的枚举类型)或者您还创建了动态使用枚举的代码时才有用。

    使用枚举实例可以做的基本上是获取值的字符串表示形式,将字符串解析回值,并获取定义值的列表。这对于像Dictionary这样的东西来说要容易得多。