除了这个事实,我同意其他答案,说你失去了类型和编译时间的安全性,使用EnumBuilderClass
应该是唯一的方法(感谢huMpty duMpty的评论)。
// sample "file":
string fileContent = @"
btn1 = 0,
btn2 = 1,
btn3 = 2,
";
var enumBody = fileContent.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
.Select(line => new { bothToken = line.Trim().Trim(',').Split('=') })
.Where(x => x.bothToken.Length == 2)
.Select(x => new { Name = x.bothToken[0].Trim(), Value = int.Parse(x.bothToken[1].Trim()) });
AppDomain currentDomain = AppDomain.CurrentDomain;
AssemblyName asmName = new AssemblyName("EnumAssembly");
AssemblyBuilder asmBuilder = currentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mb = asmBuilder.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
string enumTypeName = string.Format("{0}.{1}", typeof(MyControls).Namespace, typeof(MyControls).Name);
EnumBuilder eb = mb.DefineEnum(enumTypeName, TypeAttributes.Public, typeof(int));
foreach(var element in enumBody)
{
FieldBuilder fb1 = eb.DefineLiteral(element.Name, element.Value);
}
Type eType = eb.CreateType();
foreach (object obj in Enum.GetValues(eType))
{
Console.WriteLine("{0}.{1} = {2}", eType, obj, ((int)obj));
}
输出:
Namespacename.MyControls.btn1 = 0
Namespacename.MyControls.btn2 = 1
Namespacename.MyControls.btn3 = 2
有你看着[EnumBuilder类](http://msdn.microsoft.com/en-us/library/system.reflection.emit.enumbuilder%28v= vs.110%29.aspx)?你也许需要看看[C#中的动态枚举](http://stackoverflow.com/questions/725043/dynamic-enum-in-c-sharp) – 2014-12-04 09:11:50
为什么首先使用'enum'? – Rik 2014-12-04 09:14:12
这里有什么要求?它是否被用于自动将Enum绑定到组合框或类似的框架? – 2014-12-04 09:17:20