Sjoerd
Sjoerd

Reputation: 75629

Compile time tree structure

I want to retrieve values from a tree stored in another system. For example:

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

To avoid typing errors and invalid keys, I want to check the name at compile time by creating an object or class with the tree structure in it:

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

Is there an easy way to do this in C# without creating classes for each tree node? Can I use anonymous classes or subclasses? Should I create the code automatically?

Upvotes: 5

Views: 298

Answers (4)

Hasan Fahim
Hasan Fahim

Reputation: 3885

Try some thing like this:

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

Now you can get each value with intellisence.

Although I prefer @dtb approach. Still I think my approach is quite light weight.

Upvotes: 1

dtb
dtb

Reputation: 217341

If you want compile-time checking, you need to define your structure using compile-time constructs in some way. You could use T4 text template to automatically generate code from the tree structure.

Possible ways I can think of:

Nested static classes

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";
                    }
                }
            }
        }
    }
}

Namespaces and static classes

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

(Note that you can't have both a class Ford in namespace Vehicle.Car and classes in a namespace Vehicle.Car.Ford.)

Upvotes: 4

Andrew Savinykh
Andrew Savinykh

Reputation: 26300

  • You can't do this without creating classes for each tree node
  • Anonymous types and/or subclasses won't help here (at least I can't see how)
  • You can generated the classes automatically, you will need to write a code generator for it, or use an existing one such as t4 or CodeSmith. You will still need to write some code even with an existing code generator to tell it how to generate your classes.

Upvotes: 1

Variant
Variant

Reputation: 17375

You can probably find a way to do it with C# Extension methods: http://msdn.microsoft.com/en-us/library/bb383977.aspx

But there's probably no escape from some automatic code generation

Upvotes: 0

Related Questions