Я использую концепцию классов перечисления, описанную в .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
Все мои попытки оказались безуспешными. Код, показанный здесь, показывает подтип на том же уровне, что и тип, а не под ним.
Есть какие-нибудь идеи о том, что такое секретный соус, чтобы заставить эту работу работать так, как я хочу?