首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >根据数据库查找表中的值自动创建Enum?

根据数据库查找表中的值自动创建Enum?
EN

Stack Overflow用户
提问于 2009-04-07 02:43:43
回答 15查看 163.8K关注 0票数 132

如何根据数据库查找表中的值(使用企业库数据层)自动创建枚举并随后在C#中使用其值?

例如,如果我在数据库中添加了一个新的查找值,我不希望在代码中手动添加额外的静态枚举值声明--我希望使枚举与数据库保持同步。

有这样的事吗?

我不想创建一个代码生成的静态枚举(根据代码项目文章http://www.codeproject.com/KB/database/EnumGenerator.aspx),并希望它是完全自动的。

EN

回答 15

Stack Overflow用户

发布于 2009-04-26 21:28:06

我正在做这件事,但您需要做一些代码生成才能正常工作。

在我的解决方案中,我添加了一个项目"EnumeratedTypes“。这是一个控制台应用程序,它从数据库中获取所有值并从它们构造枚举。然后将所有枚举保存到程序集中。

枚举生成代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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));

// Get data from database
MyDataAdapter someAdapter = new MyDataAdapter();
MyDataSet.MyDataTable myData = myDataAdapter.GetMyData();

foreach (MyDataSet.MyDataRow row in myData.Rows)
{
    myEnum.DefineLiteral(row.Name, row.Key);
}

// Create the enum
myEnum.CreateType();

// Finally, save the assembly
assemblyBuilder.Save(name.Name + ".dll");

解决方案中的其他项目引用此生成的程序集。因此,我可以在代码中使用动态枚举,并使用intellisense完成。

然后,我添加了一个构建后事件,以便在构建了这个"EnumeratedTypes“项目之后,它自己运行并生成"MyEnums.dll”文件。

顺便说一句,它有助于改变项目的构建顺序,以便首先构建"EnumeratedTypes“。否则,一旦开始使用动态生成的.dll,如果删除.dll,就无法进行构建。(鸡和蛋类的问题--解决方案中的其他项目需要这个.dll来正确构建,并且在构建解决方案之前不能创建.dll .)

我从这篇msdn文章获得了上面的大部分代码。

希望这能有所帮助!

票数 103
EN

Stack Overflow用户

发布于 2009-04-07 02:53:38

枚举必须在编译时指定,不能在运行时动态添加枚举--为什么代码中没有对它们的使用/引用?

来自专业C# 2008:

在C#中枚举的真正强大之处在于,它们在幕后被实例化为从基类System.Enum派生的结构。这意味着可以调用针对它们的方法来执行一些有用的任务。请注意,由于.NET框架的实现方式,因此在语法上将枚举视为结构不会造成性能损失。实际上,一旦编译了代码,枚举就会以原语类型存在,就像int和float一样。

所以,我不确定你能不能用你想用的方式。

票数 55
EN

Stack Overflow用户

发布于 2009-04-07 02:47:05

一定要是真的吗?不如用Dictionary<string,int>代替呢?

例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dictionary<string, int> MyEnum = new Dictionary(){{"One", 1}, {"Two", 2}};
Console.WriteLine(MyEnum["One"]);
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/725043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文