Как мне получить все значения из моего расширенного класса перечисления?
Я решил, что один из перечисления в моем проекте может быть полезно быть более умным и следовать примеру Microsoft на следующей странице:
Майкрософт Продлила Перечисление
Это сокращенная версия моего кода:
public abstract class Enumeration : IComparable { protected Enumeration() {} protected Enumeration( int id, string name ) { Id = id; Name = name; } public int Id { get; } public string Name { get; } public int CompareTo( object other ) => Id.CompareTo( ((Enumeration)other).Id ); public override string ToString() => Name; public static IEnumerable<T> GetAll<T>() where T : Enumeration, new() { Type type = typeof( T ); FieldInfo[] fields = type.GetTypeInfo().GetFields( BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly ); foreach( var info in fields ) { var instance = new T(); var locatedValue = info.GetValue( instance ) as T; if( locatedValue != null ) yield return locatedValue; } } public override bool Equals(object obj) { if( !( obj is Enumeration otherValue ) ) return false; var typeMatches = GetType().Equals(obj.GetType()); var valueMatches = Id.Equals(otherValue.Id); return typeMatches && valueMatches; } public override int GetHashCode() { return Id.GetHashCode(); } } public class Fruit : Enumeration { public static Fruit Apple = new AppleFruitType(); public static Fruit Banana = new BananaFruitType(); public static Fruit Orange = new OrangeFruitType(); protected Fruit( int id, string name ) : base( id, name ) { } private class AppleFruitType : Fruit { public AppleFruitType() : base( 0, "Apple" ) {} } private class BananaFruitType : Fruit { public BananaFruitType() : base( 1, "Banana" ) {} } private class OrangeFruitType : Fruit { public OrangeFruitType() : base( 2, "Orange" ) {} } } public class MainApplication { public void SomeCode() { // None of these three lines will compile. List<Fruit> AllFruits1 = Fruit.GetAll(); List<Fruit> AllFruits2 = Fruit.GetAll<Fruit>(); List<Fruit> AllFruits3 = Fruit.GetAll<Enumeration>(); List<Fruit> AllFruits4 = Fruit.GetAll().ToList<Fruit>; List<Fruit> AllFruits5 = Fruit.GetAll<Fruit>().ToList<Fruit>; List<Fruit> AllFruits6 = Fruit.GetAll<Enumeration>().ToList<Fruit>; } }
Хотя информация компилятора о том, почему эти шесть строк не работают, кажется ясной, я не могу понять, что мне нужно написать, чтобы это сработало.
Может ли кто-нибудь объяснить эту очевидную вопиющую дыру в моих знаниях языка?
Что я уже пробовал:
Примеры приведены в приведенном выше коде.