Структура дерева времени компиляции - PullRequest
5 голосов
/ 09 июня 2011

Я хочу получить значения из дерева, хранящегося в другой системе.Например:

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

Чтобы избежать ошибок при вводе и неправильных ключей, я хочу проверить имя во время компиляции, создав объект или класс со структурой дерева в нем:

GetValue(Vehicle.Car.Ford.Focus.Engine.Oil.Color)
* 1006Есть ли простой способ сделать это в C # без создания классов для каждого узла дерева?Могу ли я использовать анонимные классы или подклассы?Должен ли я создать код автоматически?

Ответы [ 4 ]

4 голосов
/ 09 июня 2011

Если вы хотите проверять время компиляции, вам нужно как-то определить структуру, используя конструкции времени компиляции.Вы можете использовать текстовый шаблон 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";
    }
}

(Обратите внимание, что нельзя иметь класс Ford в пространстве имен Vehicle.Car и классы впространство имен Vehicle.Car.Ford.)

1 голос
/ 09 июня 2011

Попробуйте что-нибудь вроде этого:

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

Теперь вы можете получить каждое значение с помощью intellisence.

Хотя я предпочитаю подход @dtb. Тем не менее, я думаю, что мой подход довольно легкий вес.

1 голос
/ 09 июня 2011
  • Вы не можете сделать это без создания классов для каждого узла дерева
  • Анонимные типы и / или подклассы здесь не помогут (по крайней мере, я не понимаю, как)
  • Вы можете сгенерировать классы автоматически, вам нужно написать генератор кода для него или использовать существующий, такой как t4 или CodeSmith .Вам все еще нужно будет написать некоторый код даже с существующим генератором кода, чтобы сообщить ему, как генерировать ваши классы.
0 голосов
/ 09 июня 2011

Вероятно, вы можете найти способ сделать это с помощью методов расширения C #: http://msdn.microsoft.com/en-us/library/bb383977.aspx

Но, вероятно, нет выхода из автоматического создания кода

...