Как получить доступ к подклассу, используя строковую переменную - PullRequest
0 голосов
/ 23 января 2019

У меня есть следующая структура классов и подклассов:

public class Regions
    {
        public const string UNITEDSTATES = "United States";
        public static string[] members = { UNITEDSTATES};

        public static class UnitedStatesTypes
        {
            public const string STEEL = "steel";
            public const string CONCRETE = "concrete";
            public static string[] members = { STEEL, CONCRETE };

            public static class SteelStandards
            {
                public const string A36 = "ASTM A36";
                public static string[] members = { A36 };

                public static class A36Grades
                {
                    public const string GRADE_36 = "Grade 36";
                    public static string[] members = { GRADE_36 };
                }
            public static class ConcreteStandards
            {
                ...
            }

В каждом из классов есть больше значений, но это лишь небольшой пример, чтобы вы могли понять, что это такое.похоже.Я пытаюсь создать пользовательский интерфейс, чтобы выбрать каждый из них.Есть 4 выпадающих меню, каждое меню заполняется значением более высокого меню.Таким образом, если раскрывающийся список стандартов находится в SteelStandards, следующий раскрывающийся список заполняется A36, если он был в ConcreteStandards, следующий будет заполняться данными в ConcreteStandards.Есть ли способ, которым я могу получить доступ к подклассу, используя строковую переменную?

Например, первый выпадающий список выберет Соединенные Штаты.Следующее раскрывающееся меню должно собрать «UnitedStatesTypes» и затем получить доступ к Regions.UnitedStatesTypes.members.Я пытался использовать фигурные скобки

Regions["UnitedStatesTypes"].members

, но это не сработало.Есть ли способ сделать это?Или есть лучший способ организовать мои данные?

1 Ответ

0 голосов
/ 23 января 2019

Вы можете сделать это только с помощью словарей, хотя это становится немного громоздким, когда вы спускаетесь по дереву:

var regions = new Dictionary<string,Dictionary<string,Dictionary<string,Dictionary<string,List<string>>>>>();
// populate it. Yes I know how ugly that will look!
var usSteelStandards = regions["United States"]["Steel"]["Standards"];

Лучшим способом может быть рефакторинг вашего кода как набора экземпляров классов, вместо того, чтобы пытаться использовать статические классы / члены полностью. Это типичная древовидная структура

public class Node : IEnumerable<Node>
{
   public Node(string text)
   {
        this.Text = text;
       this.Children = new List<Node>(); 
   }
   public string Text {get; private set;}
   public List<Node> Children { get; private set;} 

   public Node this[string childText]
   {
      get{ return this.Children.FirstOrDefault(x => x.Text == childText); }
   } 

   public void Add(string text, params Node[] childNodes)
   {
       var node = new Node(text);
       node.Children.AddRange(childNodes);
       this.Children.Add(node);
   }

    public IEnumerator<Node> GetEnumerator()
    {
        return Children.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

Это можно настроить и использовать гораздо проще

var node = new Node("root")
{
    {
        "United States", 
         new Node("Steel")
         {
             {
                 "ASTM A36",
                 new Node("Grade 36")
             }
         },
         new Node("Concrete")
         {

         }
    }
};

Console.WriteLine(node["United States"].Children.Count);
Console.WriteLine(node["United States"]["Steel"]["ASTM A36"].Children[0].Text);

Живой пример: https://rextester.com/QVGN99585

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...