Как создать класс Enumeration, содержащий подкласс Enumeration - PullRequest
0 голосов
/ 22 октября 2019

Я использую концепцию классов перечисления, описанную в .Net Architecture Guide . Я создал классы перечисления для ParticipantType и ParticipantSubType.

public abstract class ParticipantTypeEnumeration : IComparable
{
  public int ID { get; private set; }
  public string Name { get; private set; }
  public string Description { get; set; }

  public class ParticipantSubTypes : ParticipantSubTypeEnumeration
  {
    // I will substitute code to instantiate the actual subtypes once this is working.
    // I have tried every scenario I can think of to add the sub types to the parent type.
    public static ParticipantSubTypes SubType1 = new ParticipantSubTypes(1001, "SubType1", "This is a SubType1");
    public static ParticipantSubTypes SubType2 = new ParticipantSubTypes(1001, "SubType2", "This is a SubType2");
    public static ParticipantSubTypes SubType3 = new ParticipantSubTypes(1001, "SubType3", "This is a SubType3");

    public ParticipantSubTypes(int id, string name, string description) : base(id, name, description)
    {
    }
  }

  protected ParticipantTypeEnumeration(int id, string name, string description)
  {
    ID = id;
    Name = name;
    Description = description;
  }

  public override string ToString() => Name;

  public int CompareTo(object other) => ID.CompareTo(((ParticipantTypeEnumeration)other).ID);
}

и

public abstract class ParticipantSubTypeEnumeration : IComparable
{
  public int ID { get; private set; }
  public string Name { get; private set; }
  public string Description { get; set; }

  protected ParticipantSubTypeEnumeration() { }
  protected ParticipantSubTypeEnumeration(int id)
  {
  }
  protected ParticipantSubTypeEnumeration(int id, string name, string description)
  {
    ID = id;
    Name = name;
    Description = description;
  }

  public override string ToString() => Name;

  public static IEnumerable<T> GetAll<T>() where T : ParticipantSubTypeEnumeration
  {
    var fields = typeof(T).GetFields(BindingFlags.Public |
                                     BindingFlags.Static |
                                     BindingFlags.DeclaredOnly);

    return fields.Select(f => f.GetValue(null)).Cast<T>();
  }

  public int CompareTo(object other) => ID.CompareTo(((ParticipantSubTypeEnumeration)other).ID);
}

Затем я реализую это следующим образом.

public class ParticipantTypeTest : ParticipantTypeEnumeration
{
  public static ParticipantTypeTest Party = new ParticipantTypeTest(10002, "Party", "This is a party on a case.");
  public static ParticipantTypeTest Participant = new ParticipantTypeTest(10003, "Participant", "This is a participant on a case.");
  public static ParticipantTypeTest Auxiliary = new ParticipantTypeTest(10004, "Auxiliary", "Participant types that should not normally be displayed with Parties and Participants.");

  public ParticipantTypeTest(int id, string name, string description) : base(id, name, description)
  {
  }
}

Я хочу иметь возможностьполучить доступ к этому классу, чтобы получить значения для участника, как этот (который работает сейчас).

SMC.Classes.ParticipantTypeTest.Auxiliary.ID

А также получить значения для подтипов каждого типа, как этот.

SMC.Classes.ParticipantTypeTest.Auxiliary.ParticipantSubTypes.SubType1.Name

Все мои попытки оказались безуспешными. Код, показанный здесь, показывает подтип на том же уровне, что и тип, а не под ним.

Есть какие-нибудь идеи о том, что такое секретный соус, чтобы заставить эту работу работать так, как я хочу?

...