.NET标准库中在编译时动态创建枚举

时间:2019-09-06 06:37:42

标签: c# enums reflection.emit .net-standard-2.0

我正在从事图书馆项目。我会将这个库dll分发给其他一些项目以供参考。我的目标是每次构建项目(引用我的dll的客户端项目)时都生成一个枚举。

我想在构建时基于从api获取的值创建Enum类型。 我正在使用.net标准库(2.0)。 要求是在编译时根据一个值创建一个Enum,我将从api调用中获取该值。 我尝试了以下代码

 // 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 name = new AssemblyName("MyEnums");
        AssemblyBuilder assemblyBuilder = currentDomain.DefineDynamicAssembly(name,
                                              AssemblyBuilderAccess.RunAndSave);

        // Define a dynamic module in "MyEnums" assembly.
        // For a single-module assembly, the module has the same name as the assembly.
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(name.Name,
                                          name.Name + ".dll");

        // Define a public enumeration with the name "MyEnum" and an underlying type of Integer.
        EnumBuilder myEnum = moduleBuilder.DefineEnum("EnumeratedTypes.MyEnum",
                                 TypeAttributes.Public, typeof(int));

但是“ DefineDynamicAssembly”不可用。

有人可以引导我这样做吗? 提前致谢。

1 个答案:

答案 0 :(得分:0)

编写一个可以在需要时写入.cs文件的程序。在Visual Studio中,可以在构建项目之前和之后运行命令。 对于在编译时创建Code而言,这是最简单的方法。根据它应该有多复杂,一个简单的批处理文件就足够了,但是我不认为使用批处理文件进行api调用那么容易。

我认为您的意思是在运行时创建枚举,这是因为DefineDynamicAssembly的麻烦。