2009-05-13 35 views
27

Tôi có một enum của stucture sau:động tạo một enum

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

Tôi đang sử dụng enum này để có được tên và các giá trị. Vì có yêu cầu thêm nhiều loại, tôi cần phải đọc loại và các giá trị từ một tệp XML. Có cách nào mà tôi có thể tạo enum động này từ tập tin XML để tôi có thể giữ lại cấu trúc chương trình.

Trả lời

42

Có thể, bạn nên cân nhắc sử dụng Dictionary<string, int> để thay thế.

Nếu bạn muốn tạo enum tại thời gian biên dịch động, bạn có thể muốn xem xét T4.

+1

Tôi đồng ý. Tất cả các tham chiếu đến các giá trị riêng lẻ của một enum được chuyển thành các chữ số theo thời gian biên dịch. Điều này có thể tạo ra các vấn đề về phiên bản tiềm năng. Tuy nhiên nó không phải là không thể. Một nơi nào đó tôi đọc CodeDom có ​​thể giúp bạn nhưng nhận thức được nó là rất nhiều công việc. Không chắc chắn nếu nó worht nỗ lực. – Prithis

+0

+1 cho [T4] (http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx) – elimad

26

Sử dụng EnumBuilder để tạo enums động. Điều này đòi hỏi phải sử dụng Reflection.

BƯỚC 1: TẠO ENUM SỬ DỤNG HỘI/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"); 

Bước 2: Sử dụng ENUM TẠO

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

Hy vọng rằng sẽ giúp

+0

Tuyệt vời !!! Tôi không biết bạn có thể tạo ra một hội đồng tại thời gian chạy –

+0

Có, nhưng làm thế nào tôi có thể hứa rằng enum này sẽ tồn tại để xây dựng ứng dụng của tôi thành công? – kuskmen

+0

Tôi biết điều này hơi trễ một chút, nhưng vì điều này trùng lặp với một bài đăng khác, tôi sẽ trả lời câu hỏi của kuskmen: bạn không biết. Bạn đang tạo các kiểu tại _runtime_. – john

Các vấn đề liên quan