如何基于另一个类生成代码?

Bra*_*oor 9 reflection resharper code-generation codesmith visual-studio

要创建测试数据,我们使用Builder模式的以下变体(简化示例!):

样本类:

public class Person
{
   public string Name { get; set; }
   public string Country { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

建设者:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:示例本身的上下文不相关.这里重要的是如何在示例中,像PersonBuilder这样的构建器类可以通过查看实体类(Person)并应用相同的模式来完全生成 - 请参阅下文.

现在假设person类有15个属性而不是2.需要一些猴子来实现构建器类,而理论上,它可以自动从Person类生成.我们可以使用代码生成来快速设置构建器类,并在以后根据需要添加自定义代码.

代码生成过程必须知道上下文(人类的名称和属性),因此简单的基于文本的代码生成或正则表达式魔法在这里感觉不对.一种动态的解决方案,不是基于文本的,可以从视觉工作室内快速触发,是首选.

我正在寻找为这种情况执行代码生成的最佳方法.反射?CodeSmith中?T4模板?Resharper Live模板与宏?

我期待看到一些很棒的答案:)

Fel*_*ano 2

T4 解决方案是一个良好的 Visual Studio 集成选项。您可以在 T4 模板内使用反射来实际生成代码。