编译时树结构

5
我希望能够从另一个系统中存储的树形结构中获取值。例如:
GetValue("Vehicle.Car.Ford.Focus.Engine.Oil.Color")

为了避免输入错误和无效的键,我希望通过创建一个具有树形结构的对象或类,在编译时检查名称:
GetValue(Vehicle.Car.Ford.Focus.Engine.Oil.Color)

在不为每个树节点创建类的情况下,有没有一种简单的方法在C#中完成这个任务?我可以使用匿名类或子类吗?是否应该自动生成代码?


你可以(应该)自动创建代码。 - sehe
你的意思是这就像一个类层次结构吗? - Tony The Lion
是的,一个类层次结构。Oil.Color 可能是包含键的字符串。 - Sjoerd
1
你可以使用一堆属性和类型转换,类树或其他类似的方法来实现这个功能,但这似乎有点奇怪——如果你正在使用的结构是硬编码的,那么你只有一次机会来输错。如果它不是硬编码的,那么在尝试复制树形结构时,你将遇到问题——犯错误的机会更大。 - Iain Ballard
4个回答

4
如果你想进行编译时检查,你需要以某种方式使用编译时构造定义你的结构。你可以使用T4文本模板从树形结构自动生成代码。
我能想到的可能方法有:
嵌套静态类
public static class Vehicle
{
    public static class Car
    {
        public static class Ford
        {
            public static class Focus
            {
                public static class Engine
                {
                    public static class Oil
                    {
                        public static readonly string Color =
                            "Vehicle.Car.Ford.Focus.Engine.Oil.Color";
                    }
                }
            }
        }
    }
}

命名空间和静态类

namespace Vehicle.Car.Ford.Focus.Engine
{
    public static class Oil
    {
         public static readonly string Color =
             "Vehicle.Car.Ford.Focus.Engine.Oil.Color";
    }
}

(请注意,您不能在命名空间Vehicle.Car中同时拥有类Ford和命名空间Vehicle.Car.Ford中的类。)

1
  • 你不能不为每个树节点创建类就能做到这一点。
  • 匿名类型和/或子类在这里没有帮助(至少我看不出来怎么帮助)。
  • 你可以自动生成这些类,你需要编写一个代码生成器来实现它,或者使用现有的代码生成器,如t4CodeSmith。即使使用现有的代码生成器,你仍然需要编写一些代码来告诉它如何生成你的类。

1
尝试像这样做一些事情:
var Vehicle = new { Car = new { Ford = new { Focus = new { Engine = new { Oil = new {Color = "Red"}}}}}};

现在你可以通过智能感知获取每个值。

虽然我更喜欢@dtb的方法,但我认为我的方法非常轻量级。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接