如何使用字符串变量访问子类

时间:2019-01-23 16:32:22

标签: c# unity3d

我的类和子类结构如下:

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
            {
                ...
            }

每个类下都有更多的值,但这只是一个小样本,因此您可以大致了解它的外观。我正在尝试创建一个UI来选择其中的每个。有4个下拉菜单,每个菜单由上级菜单的值填充。因此,如果标准下拉列表位于SteelStandards上,则下一个下拉列表将填充A36,如果它位于ConcreteStandards上,则下一个下拉列表将填充ConcreteStandards下的数据。有什么方法可以使用字符串变量访问子类?

例如,第一个下拉列表将选择“美国”。下一个下拉列表需要组合“ UnitedStatesTypes”,然后访问Regions.UnitedStatesTypes.members。我尝试使用花括号

Regions["UnitedStatesTypes"].members

但是这没有用。有没有办法做到这一点?还是有更好的方法来组织我的数据?

1 个答案:

答案 0 :(得分:2)

您可以只用词典来执行此操作,尽管当您从树上走下来时它会变得有些笨拙:

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