Как сгенерировать код на основе другого класса?

Чтобы создать наши тестовые данные, мы используем следующий вариант шаблона Строитель (упрощенный пример!):

Пример класса:

public class Person
{
   public string Name { get; set; }
   public string Country { get; set; }
}

Построитель:

public class PersonBuilder
{
    private string name;
    private string country;

    public PersonBuilder()
    {
        SetDefaultValues();
    }

    private void SetDefaultValues()
    {
        name = "TODO";
        country = "TODO";
    }

    public Person Build()
    {
        return new Person
                   {
                       Name = name,
                       Country = country
                   };
    }

    public PersonBuilder WithName(string  name)
    {
        this.name = name;            
        return this;
    }

    public PersonBuilder WithCountry(string country)
    {
        this.country = country;
        return this;
    }
}

ПРИМЕЧАНИЕ: Контекст сам пример не актуален. Здесь важно то, как в этом примере класс построителя, такой как PersonBuilder, может быть полностью сгенерирован путем просмотра класса сущности (Person) и применения того же шаблона - см. Ниже.

Теперь представьте, что класс человека имеет 15 свойств вместо 2. Для реализации класса построителя потребовалась бы некоторая обезьянья работа, хотя теоретически он может быть автоматически сгенерирован из класса Person. Мы могли бы использовать генерацию кода, чтобы быстро настроить класс построителя, и при необходимости добавить собственный код позже.

Процесс генерации кода должен учитывать контекст (имя и свойства класса person), поэтому простая текстовая генерация кода или магия регулярных выражений здесь не подходят. Предпочтительно решение, которое является динамическим, а не текстовым и может быть быстро запущено изнутри Visual Studio.

Я ищу лучший способ выполнить генерацию кода для подобных сценариев. Отражение? Шифровальщик? Шаблоны T4? Шаблоны Resharper Live с макросами?

Я с нетерпением жду отличных ответов :)

9
задан Bram De Moor 22 March 2011 в 14:08
поделиться