C#有枚举枚举

时间:2016-04-05 15:10:21

标签: c# enums

假设我有一个带有一些值的枚举类别:

enum Category {
ProgrammingBooks
CookingBooks
}

我希望每个枚举都有自己的枚举,例如: ProgrammingBooks将成立:

enum ProgrammingBooks {
CSharp,
Java,
Cpp
}

我看到了一个建议的解决方案:

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; }

}

用法:

Stream.of(Fauna.values()).filter(f -> f.type == BIRD).toList()

然而,我只是一个初学者,我寻找的东西即使我不知道也应该学习,不会对我说硬道理。我不明白我提到的例子(我在StackOverFlow上找到的)。

2 个答案:

答案 0 :(得分:6)

使用类或接口。例如:

GridLayout

如果你想支持"子类型"您可以提供仅属于特定类而不属于界面的属性,因为并非每本书都与编程有关。例如:

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; }
    // ...
}

为什么我要使用接口?因为所有书籍都有共同点(例如,它们都有标题和作者)。因此,您可以从Polymorphism

中受益
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; }
    // ...
}

或者如果您只想获得编程书籍:

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());
}

与LINQ的foreach (IBook book in library.Where(b => b.BookType == Category.ProgrammingBooks)) { // ... } 方法相同,只检查类型:

Enumerable.OfType

答案 1 :(得分:0)

枚举只是带有文本的整数的表示。它不能保存子类别或任何整数。

您应该为类别创建一个类,并在每个类别中保存子类别的枚举。

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

enum BookType {
   CSharp,
   Java,
   Cpp
}
相关问题