C# 有枚举的枚举

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

最佳答案

使用类或接口(interface)。例如:

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

如果你想支持“子类型”,你可以提供只属于特定类而不是接口(interface)的属性,因为不是每本书都是关于编程的。例如:

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

我为什么要使用接口(interface)?因为所有的书都有一些共同点(例如,它们都有书名和作者)。所以你可以从Polymorphism中获益:

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

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

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

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

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

关于C# 有枚举的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430265/

相关文章:

带有来自 NuGet 的 QuickGraph 包的 C#

c# - Wixsharp 如何引用自定义 Action 项目

c# - C# 中如何检测文件是否不是文本文件

c# - Ruby - 枚举文件

c++ - 如何将范围放在枚举上?

vb6 - VB6 中的标志没有返回正确的值

c# - 错误 : "Could not load file or assembly System.Web.WebPages.Razor"

c# - 如何在 Lucene.Net 中实现正确的模糊搜索?

数据库实体的 Java 构建器范例

java - 接口(interface)中有更多枚举