我的类和子类结构如下:
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
但是这没有用。有没有办法做到这一点?还是有更好的方法来组织我的数据?
答案 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);