2011-06-09 16 views
5

Deseo recuperar valores de un árbol almacenado en otro sistema. Por ejemplo:Estructura de árbol de tiempo de compilación

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

Para evitar errores de escritura y las claves no válidas, quiero comprobar el nombre en tiempo de compilación mediante la creación de un objeto o clase con la estructura de árbol en ella:

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

¿Existe una ¿manera fácil de hacer esto en C# sin crear clases para cada nodo de árbol? ¿Puedo usar clases o subclases anónimas? ¿Debo crear el código automáticamente?

+0

Podría (debería) crear el código automáticamente – sehe

+0

¿Quiere decir que esto es como una jerarquía de clases? –

+0

Sí, una jerarquía de clases. Oil.Color probablemente sería una cadena que contiene la clave. – Sjoerd

Respuesta

4

Si desea una verificación en tiempo de compilación, debe definir su estructura de alguna manera mediante construcciones en tiempo de compilación. Puede usar T4 text template para generar código automáticamente desde la estructura de árbol.

maneras posibles que se me ocurren:

clases anidadas estáticas

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

espacios de nombres y clases estáticas

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

(Tenga en cuenta que no se puede tener tanto una clase Ford en el espacio de nombres Vehicle.Car y cl asnos en un espacio de nombres Vehicle.Car.Ford)

1
  • No se puede hacer esto sin la creación de clases para cada nodo de árbol
  • Los tipos y/o subclases anónimos no ayudarán aquí (al menos no puedo ver cómo)
  • Puede generar las clases automáticamente, tendrá que escribir un generador de código para ello, o usar un existe en g uno como t4 o CodeSmith. Todavía necesitará escribir algún código incluso con un generador de código existente para decirle cómo generar sus clases.
1

Pruebe algo como esto:.

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

Ahora puede obtener cada valor con Intellisence.

Aunque prefiero el enfoque de @dtb. Todavía creo que mi enfoque es bastante ligero.

Cuestiones relacionadas