2016-04-05 12 views
3

Angenommen, ich eine Enumeration Kategorie mit einigen Werten haben:C# mit Aufzählungen von Aufzählungen

enum Category { 
ProgrammingBooks 
CookingBooks 
} 

und ich möchte jeden Enum seine eigene Enum haben, zum Beispiel: ProgrammingBooks halten wird:

enum ProgrammingBooks { 
CSharp, 
Java, 
Cpp 
} 

ich sah eine Lösung dieses darauf hindeutet:

enum Fauna { 
enum Type { MAMMAL, BIRD } 

TIGER(Type.MAMMAL), 
LION(Type.MAMMAL), 
PEACOCK(Type.BIRD), 
OWL(Type.BIRD); 

private final Type type; 

Fauna(Type type) { this.type = type; } 

} 

mit der Nutzung:

Allerdings bin ich nur ein Anfänger und ich suche nach etwas, das, selbst wenn ich nicht weiß und lernen sollte, nicht hardcore auf mich gehen wird. Ich verstehe das Beispiel, das ich erwähnt habe (das ich auf StackOverFlow gefunden habe) nicht.

+6

Sieht eher wie Java als C# aus. –

+14

Sie sollten wirklich Klassen erstellen, wenn Ihre Enums ihre eigenen Enums benötigen. Sie dehnen den Zweck von enums anders aus. –

+2

Als Referenz, https://stackoverflow.com/questions/20605628/iterating-enum-of-enums scheint zu sein, wo dieses Beispiel herkommt; und, wie @Uwekeim sagt, es ist Java. –

Antwort

6

Verwenden Sie Klassen oder Schnittstellen. Zum Beispiel:

public enum Category 
{ 
    ProgrammingBooks, 
    CookingBooks 
} 

public interface IBook 
{ 
    Category BookType { get; set; } 
    string Title { get; set; } 
    string Author { get; set; } 
    // ... 
} 

public class ProgrammingBook: IBook 
{ 
    public ProgrammingBook() 
    { 
     this.BookType = Category.ProgrammingBooks; 
    } 
    public string Author { get; set; } 
    public string Title { get; set; } 
    public Category BookType { get; set; } 
    // ... 
} 

public class CookBook : IBook 
{ 
    public CookBook() 
    { 
     this.BookType = Category.CookingBooks; 
    } 
    public string Author { get; set; } 
    public string Title { get; set; } 
    public Category BookType { get; set; } 
    // ... 
} 

Wenn Sie „Untertypen“ zu unterstützen, können Sie Eigenschaften zur Verfügung stellen, die nur für eine bestimmte Klasse und nicht in die Schnittstelle gehören, weil nicht jedes Buch über die Programmierung ist. Zum Beispiel:

public enum ProgrammingLanguage 
{ 
    CSharp, 
    Java, 
    Cpp 
} 

public class ProgrammingBook: IBook 
{ 
    // a constructor that takes the ProgrammingLanguage as argument 
    public ProgrammingBook(ProgrammingLanguage language) 
    { 
     this.BookType = Category.ProgrammingBooks; 
     this.Language = language; 
    } 

    public ProgrammingLanguage Language { get; set; } 
    public string Author { get; set; } 
    public string Title { get; set; } 
    public Category BookType { get; set; } 
    // ... 
} 

Warum verwende ich überhaupt Schnittstellen? Weil alle Bücher etwas gemeinsam haben (zB haben sie alle einen Titel und einen Autor). So können Sie von Polymorphism profitieren:

var library = new List<IBook>(); 
var book1 = new ProgrammingBook(ProgrammingLanguage.CSharp) {Title = "C# in Depth", Author = "Jon Skeet"}; 
var book2 = new CookBook() { Title = "Everyday Superfood", Author= "Jamie Oliver" }; 
library.Add(book1); 
library.Add(book2); 

// now you can loop all and you know that all books have these properties 
foreach (IBook book in library) 
{ 
    Console.WriteLine("Title: {0} Type: {1}", book.Title, book.BookType.ToString()); 
} 

oder wenn Sie wollen nur Programmierung-Bücher zu bekommen:

foreach (IBook book in library.Where(b => b.BookType == Category.ProgrammingBooks)) 
{ 
    // ... 
} 

das gleiche mit LINQ Enumerable.OfType Methode, die gerade den Typ überprüft:

foreach (IBook book in library.OfType<ProgrammingBook>()) 
{ 
    // .... 
} 
+0

Jesus Christus, ich schrieb fast den gleichen Code. Ich denke, das ist was er will. +1 –

+0

@LeandroSoares --- wooahhh, beruhige dich ... –

+1

Danke Tim! Leandro, danke auch für die Mühe. – N3wbie

0

Enum ist nur eine Darstellung einer Ganzzahl mit Text. Es kann keine Unterkategorien oder irgendetwas anderes als eine Ganzzahl enthalten.

Sie sollten eine Klasse für die Kategorien erstellen und in jeder davon eine Aufzählung der Unterkategorien speichern.

public class ProgrammingBook 
{ 
    public BookType Type{get;set;} 
} 

enum BookType { 
    CSharp, 
    Java, 
    Cpp 
} 
+0

Hast du deinen Kommentar versehentlich als Antwort gepostet? –

+1

klingt besser, kann ein Beispiel haben? – N3wbie

+0

Ich habe meine Antwort aktualisiert –