在C#中是否可以使用通用对象生成器?
我正在为一个报告系统编写一些单元测试,该系统使用一些相当复杂的DTO组合。为了测试系统,我发现自己编写了很多这样的代码:在C#中是否可以使用通用对象生成器?,c#,generics,expression-trees,builder,C#,Generics,Expression Trees,Builder,我正在为一个报告系统编写一些单元测试,该系统使用一些相当复杂的DTO组合。为了测试系统,我发现自己编写了很多这样的代码: var items = new List<Item> { new Item { Things = new List<Thing> { new Thing { Stuff
var items = new List<Item>
{
new Item
{
Things =
new List<Thing>
{
new Thing
{
Stuff =
new Stuff
{
Widgets = new List<Widget> {new Widget {Color = "Red"}}
},
Bobbles = new List<Bobble>{new Bobble(), new Bobble()}
}
}
}
};
或者类似的东西。然后我突然想到,我还需要创建其他类似的对象,如果我可以使用泛型将其应用于任何我需要的对象,那就太好了:
var items = Builder.Add<Item>()
.With<Thing>()
.With<Stuff>()
.With<Widget>()
.With<Color>("Red");
var items=Builder.Add()
.与()
.与()
.与()
。以“红色”表示;
显然,这些示例只是近似真实界面的样子
有了泛型、lambdas和表达式树这样的语法糖,C#能做到这一点吗
我搜索了一下,看看是否有人尝试过类似的事情,但只找到了一两篇关于这个主题的不完整的博客文章。在我看来,如果可能的话,可能会有一个完整的例子,或者一个开源的或商业性的库。我不明白为什么不可能。您可能需要一点不同的语法,使结构更加明显,例如:
Builder.Add<Item>(i =>
i.With<Thing>(t =>
t.With<Stuff>(s =>
s.Add<Widget>(w => w.With<string>("Red"))
.Add<Widget>(w => w.With<string>("Green")))
.Add<Bubble>()
.Add<Bubble>()));
Builder.Add(i=>
i、 与(t=>
t、 与(s=>
s、 添加(w=>w,带“红色”))
.Add(w=>w.With(“绿色”))
.Add()
.Add());
它假定给定类型的属性只有一个。例如,With
将查找键入为
的属性,Add
将查找键入的属性List
当给定类型的属性不止一个时,它会变得有点混乱。您必须以某种方式确定哪一个应设置为给定值
s.Add<Widget>(w => w.With(x => x.Color, "Red").With(x => x.Name, "MyWidget"));
s.Add(w=>w.With(x=>x.Color,“Red”)。With(x=>x.Name,“MyWidget”);
很快就变丑了。此外,perf也不是理想的,所以除了为单元测试制作实例之外,我看不到其他任何实际用途
我对现有的库一无所知。听起来NBuilder可以满足您的要求:
它已经存在,被广泛使用并且非常流行。如果说XML、JSON和XAML教会了我们什么,那就是声明性语言比命令式语言更适合创建对象图 忘记所有这些,使用XML、JSON或XAML反序列化: 下面是一个使用JSON的代码的示例:
"items": [
"item": {
"Things": [
"Thing": {
"Stuff": {
"Widgets" [
"Widget": {"Color" = "Red"}
],
"Bobbles": [
"Bobble": { }],
},
},
],
},
},
然后,只需使用许多著名的反序列化库(如)中的任何一个,将序列化数据转换为强类型对象图
免责声明:我手工输入了上面的JSON,所以它可能有语法错误,但你明白了
我不明白为什么不可能。@MarcinJuraszek:请回答这个问题,这样我们就可以投票了。:-。。。除了开玩笑,你对这个问题有什么期待?是的,这似乎是可能的。你想让别人脱口而出它的全部代码吗?那是相当多的工作,当然不是。我没有要求任何人“给我密码”。我希望得到确认(您已经给出),我不会浪费时间尝试这一点,也可能是链接到某篇文章或某个图书馆,其中有人已经率先提出了这一想法。除了C#object initializer语法是一种声明性(子)语言之外。
"items": [
"item": {
"Things": [
"Thing": {
"Stuff": {
"Widgets" [
"Widget": {"Color" = "Red"}
],
"Bobbles": [
"Bobble": { }],
},
},
],
},
},