如何根据数据库查找表中的值(使用企业库数据层)自动创建枚举并随后在C#中使用其值?
例如,如果我在数据库中添加了一个新的查找值,我不希望在代码中手动添加额外的静态枚举值声明--我希望使枚举与数据库保持同步。
有这样的事吗?
我不想创建一个代码生成的静态枚举(根据代码项目文章http://www.codeproject.com/KB/database/EnumGenerator.aspx),并希望它是完全自动的。
发布于 2009-04-26 21:28:06
我正在做这件事,但您需要做一些代码生成才能正常工作。
在我的解决方案中,我添加了一个项目"EnumeratedTypes“。这是一个控制台应用程序,它从数据库中获取所有值并从它们构造枚举。然后将所有枚举保存到程序集中。
枚举生成代码如下所示:
// 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文章获得了上面的大部分代码。
希望这能有所帮助!
发布于 2009-04-07 02:53:38
枚举必须在编译时指定,不能在运行时动态添加枚举--为什么代码中没有对它们的使用/引用?
来自专业C# 2008:
在C#中枚举的真正强大之处在于,它们在幕后被实例化为从基类System.Enum派生的结构。这意味着可以调用针对它们的方法来执行一些有用的任务。请注意,由于.NET框架的实现方式,因此在语法上将枚举视为结构不会造成性能损失。实际上,一旦编译了代码,枚举就会以原语类型存在,就像int和float一样。
所以,我不确定你能不能用你想用的方式。
发布于 2009-04-07 02:47:05
一定要是真的吗?不如用Dictionary<string,int>
代替呢?
例如
Dictionary<string, int> MyEnum = new Dictionary(){{"One", 1}, {"Two", 2}};
Console.WriteLine(MyEnum["One"]);
https://stackoverflow.com/questions/725043
复制相似问题