在C#中是否可以使用通用对象生成器?

在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

我正在为一个报告系统编写一些单元测试,该系统使用一些相当复杂的DTO组合。为了测试系统,我发现自己编写了很多这样的代码:

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": { }],
               },
            },
        ],
     },
 },