要创建我们的测试数据,我们使用了Builder模式的以下变化(简化的例子!):如何基于另一个类生成代码?
Sample类:
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)并应用相同的模式完全生成 - 请参见下文。
现在想象一下person类有15个属性而不是2个。它需要一些monkeywork来实现构建器类,而理论上它可以自动从Person类生成。我们可以使用代码生成来快速设置构建器类,并在需要时添加自定义代码。
代码生成过程必须知道上下文(人类的名称和属性),所以简单的基于文本的代码生成或正则表达式的魔法不会感觉就在这里。一个动态的解决方案,不是基于文本的,可以从Visual Studio内部快速触发。
我正在寻找执行此类场景的代码生成的最佳方法。 反思? CodeSmith中? T4模板? Resharper带宏模板?
我期待看到一些很好的答案:)
我们已经在我们的单元测试中广泛地使用了mocking,但是我从来没有想过为此使用mock :)。我认为这将是一个很好的解决这个问题的方法,但不是一般问题,它比测试更广泛。但是,非常感谢这个答案! – 2011-03-27 12:12:46