【问题标题】:Dynamically create an enum [duplicate]动态创建一个枚举[重复]
【发布时间】:2009-05-13 11:26:12
【问题描述】:

我有以下结构的枚举:

public enum DType
{       
    LMS =  0,
    DNP = -9,
    TSP = -2,
    ONM =  5,
    DLS =  9,
    NDS =  1
}

我正在使用这个枚举来获取名称和值。 由于需要添加更多类型,因此我需要从 XML 文件中读取类型和值。有什么方法可以从 XML 文件动态创建此枚举,以便保留程序结构。

【问题讨论】:

    标签: c#


    【解决方案1】:

    或许,您应该考虑改用Dictionary<string, int>

    如果您想在编译时动态生成enum,您可能需要考虑T4

    【讨论】:

    • 我同意。对枚举的各个值的所有引用都在编译时转换为数字文字。这可能会产生潜在的版本控制问题。不过也不是不可能。我在某处读过 CodeDom 可以为您提供帮助,但请注意,这需要大量工作。不确定它是否值得努力。
    • T4+1
    【解决方案2】:

    使用 EnumBuilder 动态创建枚举。这需要使用反射。

    第 1 步:使用 ASSEMBLY/ENUM BUILDER 创建枚举

    // 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);
    
    // Create the type and save the assembly.
    Type finished = eb.CreateType();
    ab.Save(aName.Name + ".dll");
    

    第 2 步:使用创建的枚举

    System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFrom("TempAssembly.dll");
    System.Type enumTest = ass.GetType("Elevation");
    string[] values = enumTest .GetEnumNames();
    

    希望有帮助

    【讨论】:

    • 太棒了!!!我不知道你可以在运行时创建程序集
    • 是的,但是我如何保证这个枚举存在才能成功构建我的应用程序?
    • 我知道这有点晚了,但由于这重复了另一篇文章,我会回答 kuskmen 的问题:你不知道。您正在 runtime 生成类型。
    • 赞成,因为我发现这个在运行时创建程序集的示例,您可以使用运行时特定类型、代码等进行填充。代码清晰,概念强大。不知道什么时候可以使用这样的东西,但我被这种方法的优雅灵活性所震撼。
    • 如果重复使用,这会有效地泄漏内存吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多