2014-11-09 12 views
6

Gibt es eine Möglichkeit, dass ich enum Werte zur Laufzeit ändern kann?Einstellung Enumerationswert zur Laufzeit in C#

beispiels Ich habe folgende Art

enum MyType 
{ 
    TypeOne, //=5 at runtime 
    TypeTwo //=3 at runtime 
} 

Ich möchte zur Laufzeit gesetzt 5-TypeOne und 3-TypeTwo.

+1

Dies ist nicht möglich. – DavidG

+3

Warum würdest du das überhaupt wollen? – Rotem

+5

+1 Ich verstehe die Down-Wähler nicht. Stimmen Sie die Frage nicht ab, weil die Antwort "nein" ist. Stimmen Sie stattdessen die Antwort "Nein" ab. – Myster

Antwort

5

auf MSDN helfen verweist Gerade HERE

  • einen Aufzählungstyp (auch eine Aufzählung genannt oder Eine enum) bietet eine effiziente Möglichkeit, eine Menge von benannten Integralkonstanten zu definieren, die einer Variablen zugewiesen werden können.

Auch HERE

Im Robuste Programmierung Abschnitt - Genau wie bei jedem konstant, alle Verweise auf die einzelnen Werte eines Aufzählungs sind Zahlenliterale bei Zeit kompilieren umgewandelt.

Also müssen Sie Ihre Idee von Enum neu ausrichten und es entsprechend verwenden.

Um Ihre Frage zu beantworten - Nein ist es nicht möglich.

0

Aufzählungen werden als konstante statische Felder kompiliert, ihre Werte werden in Ihre Assembly kompiliert, daher ist es nicht möglich, sie zu ändern. (Die konstante Werte können auch in Orten erstellt werden, wo man sie verweisen.)

Eg dieses Enum nehmen:

enum foo 
{ 
    Value = 3 
} 

Dann können Sie das Feld und seine Informationen wie diese:

var field = typeof(foo).GetField("Value", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); 
Console.WriteLine(field.GetValue(null)); 
Console.WriteLine(field.Attributes); 
+0

Falsch, sie sind als Konstanten kompiliert, nicht statische Felder. – DavidG

+0

@DavidG Ich habe Beispielcode hinzugefügt. Sie arbeiten genau wie Felder. Konstanten werden ebenfalls als Felder implementiert. – fejesjoco

3

Wie andere darauf hingewiesen haben, ist die Antwort nein.

Sie könnten aber wahrscheinlich Ihren Code Refactoring stattdessen eine Klasse zu verwenden:

public sealed class MyType 
{ 
    public int TypeOne { get; set; } 
    public int TypeTwo { get; set; } 
} 

... 

var myType = new MyType { TypeOne = 5, TypeTwo = 3 }; 

oder Variationen zu diesem Thema.

+1

Die Bereitstellung einer Alternative macht dies zu einer ausgezeichneten Antwort. – Myster

Verwandte Themen