5

我想从存储在另一个系统中的树中检索值。例如:

GetValue("Vehicle.Car.Ford.Focus.Engine.Oil.Color")

为了避免输入错误和无效键,我想在编译时通过创建一个包含树结构的对象或类来检查名称:

GetValue(Vehicle.Car.Ford.Focus.Engine.Oil.Color)

在 C# 中是否有一种简单的方法可以在不为每个树节点创建类的情况下执行此操作?我可以使用匿名类或子类吗?我应该自动创建代码吗?

4

4 回答 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";
    }
}

(请注意,您不能同时拥有 namespace 中的类和FordnamespaceVehicle.Car中的类Vehicle.Car.Ford。)

于 2011-06-09T08:06:32.257 回答
1
  • 如果不为每个树节点创建类,就无法做到这一点
  • 匿名类型和/或子类在这里无济于事(至少我看不出如何)
  • 您可以自动生成类,您需要为它编写代码生成器,或者使用现有的,例如t4CodeSmith。即使使用现有的代码生成器,您仍然需要编写一些代码来告诉它如何生成您的类。
于 2011-06-09T08:06:21.570 回答
1

尝试这样的事情:

var Vehicle = new { Car = new { Ford = new { Focus = new { Engine = new { Oil = new {Color = "Red"}}}}}};

现在您可以通过智能获取每个值。

虽然我更喜欢@dtb 方法。我仍然认为我的方法很轻。

于 2011-06-09T08:14:21.293 回答
0

您可能可以找到使用 C# 扩展方法的方法:http: //msdn.microsoft.com/en-us/library/bb383977.aspx

但是可能无法摆脱一些自动代码生成

于 2011-06-09T08:02:29.823 回答