【发布时间】:2011-10-14 07:23:31
【问题描述】:
我在 C# ASP.NET 解决方案中从我的数据库中生成表示整数 ID 的动态枚举。我想要两件事,尽管两者都不可能。
1) 例如,我希望 .ToString() 方法给我“345”,而不是枚举的字符串名称(它表示为字符串的 int)。这个问题的每一个答案似乎都在增加
[Description="Blah"]
EnumName = 1
在声明之上并使用 GetDescription() 方法。我不知道如何使用我正在使用的动态代码来做到这一点。
2) 例如,我宁愿不强制转换为 int 来使用它,我宁愿 (Enum.Name == 5)。如果这不可能,我会投,但我真的不想使用 ((int)Enum.Name)).ToString();
这里是动态代码生成:
public static void Main()
{
AppDomain domain = AppDomain.CurrentDomain;
AssemblyName aName = new AssemblyName("DynamicEnums");
AssemblyBuilder ab = domain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
List<Type> types = new List<Type>();
foreach(ReferenceType rt in GetTypes())
{
EnumBuilder eb = mb.DefineEnum(rt.Name, TypeAttributes.Public, typeof(int));
foreach (Reference r in GetReferences(rt.ID))
{
eb.DefineLiteral(NameFix(r.Name), r.ID);
}
types.Add(eb.CreateType());
}
ab.Save(aName.Name + ".dll");
foreach (Type t in types)
{
foreach (object o in Enum.GetValues(t))
{
Console.WriteLine("{0}.{1} = {2}", t, o, ((int) o));
}
Console.WriteLine();
//Console.ReadKey();
}
Console.WriteLine();
Console.WriteLine("Dynamic Enums Built Successfully.");
}
public static string NameFix(string name)
{
//Strip all non alphanumeric characters
string r = Regex.Replace(name, @"[^\w]", "");
//Enums cannot begin with a number
if (Regex.IsMatch(r, @"^\d"))
r = "N" + r;
return r;
}
可能没有办法做我想做的事,而且我会被卡住:
(int)Countries.USA //For int value
((int)Countries.CAN).ToString() //For string representation of int value, ex. "354"
有什么想法吗?
【问题讨论】:
-
我绝对确定这一定是一种通过反射生成描述属性的方法。
-
我真的不明白你为什么使用
ENUM。当您编写一些代码时,它非常有用,您可以使用一些具有好名字的值来告诉您它的真正用途。也许使用一些dictionary比enum更好,因为您是动态构建它? -
我制作了 dll,然后在我的 webapps 中引用它,然后我绑定下拉列表/复选框/单选按钮列表以在我的数据库中具有 ID 值。然后我想做一些事情,比如 if (Report == Reports.SevenDay)
-
@Ehryk,如果数据库模式是动态从数据库中的元数据中读取它们,为什么不在代码背后声明枚举?
-
部分疯狂的设计要求是某些管理员可以添加它们,我不希望与数据库的 ID 有硬性联系,因为有多个(开发、测试、产品)可能ID 不同。我用它来动态绑定它。有没有更好的办法?
标签: c# .net dynamic enums tostring