Reputation: 75629
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
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
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
Reputation: 26300
Upvotes: 1
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