2014-12-04 10 views
8

Mam aplikację systemu Windows, w której muszę wypełnić wartości wyliczeniowe w czasie wykonywania, czytając plik tekstowy o nazwie "Controls.txt". Jako ograniczenie, nie mam zamiaru używać słownika. Poniżej znajdują się wartości domyślne dostępne w enum MyControls. Muszę używać wyliczeń tylko.Wypełnij/zaktualizuj wartości wyliczeniowe w środowisku wykonawczym w języku C#

public enum MyControls 
{ 
    Button1 = 0, 
    Button2 = 1, 
    Button3 = 2, 
} 

Jeśli plik Controls.txt jest dostępna, a następnie treść wyliczenia należy zmienić jak

public enum MyControls 
{ 
    btn1 = 0, 
    btn2 = 1, 
    btn3 = 2, 
} 

jak mogę to osiągnąć. Natknąłem się również na link Creating/Modifying Enums at Runtime, ale nie mogłem się zorientować.

+5

Czy spojrzał na [EnumBuilder klasa] (http://msdn.microsoft.com/en-us/library/system.reflection.emit.enumbuilder%28v= vs.110% 29.aspx)? również może zajść potrzeba spojrzenia na [Dynamic enum in C#] (http://stackoverflow.com/questions/725043/dynamic-enum-in-c-sharp) –

+0

Po co używać "enum" w pierwszej kolejności? – Rik

+0

Jaki jest wymóg? Czy ma on być używany dla szkieletu, który automatycznie wiąże Enum z comboboxem, czy czymś podobnym? –

Odpowiedz

4

Mocno myślę, że próbujesz rozwiązać niewłaściwy problem. Wartość enum to bezpieczeństwo typu. Nie sądzę, żeby to dynamiczne wypełnianie było dobrym pomysłem. To, co naprawdę by się przydało, to wyliczenie enum przez plik tekstowy (na przykład) nawet przed kompilacją. Możesz to zrobić za pomocą szablonów tekstowych w VS.

można znaleźć przykład na moim blogu tutaj: http://skleanthous.azurewebsites.net/post/2014/05/21/Creating-enums-from-the-database-and-using-them-in-Entity-framework-5-and-later-in-model-first

Mimo, że mój przykład ładuje z db, zmieniając go załadować z pliku tekstowego powinna być trywialne.

3

Niezależnie od tego, że zgadzam się z drugą odpowiedzią, która mówi, że tracisz bezpieczeństwo typu i czasu kompilacji, korzystanie z EnumBuilderClass powinno być jedynym sposobem (dzięki komentarzowi 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)); 
} 

wyjściowa:

Namespacename.MyControls.btn1 = 0 
Namespacename.MyControls.btn2 = 1 
Namespacename.MyControls.btn3 = 2 
+0

pozwól mi spróbować i zaktualizować wyniki. – sia

Powiązane problemy