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---呜呜,安静下来……谢谢你,蒂姆!莱安德罗,也谢谢你的努力。