C#具有枚举的枚举

C#具有枚举的枚举,c#,enums,C#,Enums,假设我有一个带有一些值的枚举类别: enum Category { ProgrammingBooks CookingBooks } 我希望每个枚举都有自己的枚举,例如: 程序手册将包含: enum ProgrammingBooks { CSharp, Java, Cpp } 我看到一个解决方案建议: enum Fauna { enum Type { MAMMAL, BIRD } TIGER(Type.MAMMAL), LION(Type.MAMMAL), PEACOCK(Type.BI

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

enum Category {
ProgrammingBooks
CookingBooks
}
我希望每个枚举都有自己的枚举,例如: 程序手册将包含:

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上找到的)。

枚举只是一个整数的文本表示。它只能保存子类别或整数

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

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

enum BookType {
   CSharp,
   Java,
   Cpp
}

使用类或接口。例如:

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; }
    // ...
}
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; }
    // ...
}
如果您想支持“子类型”,您可以提供只属于特定类而不属于接口的属性,因为不是每本书都是关于编程的。例如:

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; }
    // ...
}
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; }
    // ...
}
为什么我要使用接口?因为所有的书都有共同点(例如,它们都有一个书名和一个作者)。因此,您可以受益于:

与LINQ的
Enumerable.OfType
方法相同,该方法只检查类型:

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

看起来更像Java而不是C。如果您的枚举需要自己的枚举,您应该真正创建类。否则,您就扩展了枚举的用途;而且,正如@UweKeim所说,这是Java。你是不是无意中发布了你的评论作为答案?听起来更好,可以举个例子吗?我已经更新了我的答案,天哪,我写的代码几乎是一样的。我想这就是他想要的+1@LeandroSoares---呜呜,安静下来……谢谢你,蒂姆!莱安德罗,也谢谢你的努力。