2009-04-30 6 views
0

Ich möchte eine Klasse mit einer verschachtelten Enumeration erstellen.Verschachtelte Aufzählungen mit System.Reflection.Emit

public class Foo 
{ 
    public enum Views 
    { 
    } 
} 

jedoch System.Reflection.Emit.TypeBuilder Klasse hat keine DefineNestedEnum nur DefinedNestedType. ModuleBuilder.DefeEnum existiert, die mich eine Enum erstellen lassen, aber ich finde keine Möglichkeit, es verschachtelt zu machen. Kann ich ein Enum erstellen, ohne es zu fälschen (d. H. Mit EnumBuilder)?


Ich bewegte meine Lösung zu einer Antwort unten.

Antwort

2

Verschieben meiner Antwort Ich setze die Frage hier ein.


Das Einzige, was ich denken kann, ist eine verschachtelte Art wie versiegelte Klasse zu definieren, die System.Enum erstreckt und definiert Öffentlichkeit | statische | wörtliche Felder mit konstanten Werten. Dies ist im Wesentlichen was der C# -Compiler tut, basierend auf dem, was ich gelernt habe, indem ich ihn zerlege. Wenn ich dies tue und die Assembly referenziere, erkennt Intellisense es als Enum und funktioniert genau wie ein Enum.


Dies ist genau die Methode MSDN zeigt, dass Jeremy verknüpft.

3

Siehe das Beispiel am Ende von this article, die genau das tut, was Sie wollen. (Sie verwenden DefineNestedType mit den richtigen Argumenten)

+0

Wie unterscheidet sich das von dem, was ich gesagt habe? Ein verschachtelter Typ, der von System.Enum mit Definitionsfeldern mit konstanten Werten erbt. Dieses MSDN-Beispiel scheint jedoch anzuzeigen, dass keine Unterstützung für das Erstellen verschachtelter Enums vorhanden ist. –

+0

Der Punkt ist: Das ist eine verschachtelte Enumeration - ein verschachtelter Typ, der von System.Enum erbt, der Felder mit konstanten Werten definiert. Sehen Sie sich in Reflector an, was das MSDN-Beispiel in seiner emittierten Assembly erzeugt, und vergleichen Sie es mit einer verschachtelten Enumeration, die durch Kompilieren einer C# -Klasse mit einer verschachtelten Enumeration erzeugt wird. Sie werden feststellen, dass sie identisch sind. – jlew

+0

Wie ist der MSDN-Artikel, den Sie verlinkt haben, anders als der, den ich ursprünglich in der Frage gepostet hatte (und seitdem zu einer Antwort verschoben wurde)? Meine Frage geht nicht darum, wie man ein enum vortäuscht (ich habe das klar abgedeckt). EnumBuilder existiert, um alle Details zu verbergen, was ein Enum wirklich ist, aber ich finde keine Möglichkeit, einen EnumBuilder zu bekommen und verschachtelt zu haben. –