【发布时间】:2015-02-25 22:20:56
【问题描述】:
我正在为使用一些相当复杂的 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 = ItemBuilder.AddItem()
.WithThing()
.WithStuff()
.WithWidget()
.WithColor("Red");
或者类似的东西。然后我突然想到我需要像这样创建其他对象,如果我可以使用泛型将其应用于我需要的任何对象,那就太好了:
var items = Builder.Add<Item>()
.With<Thing>()
.With<Stuff>()
.With<Widget>()
.With<Color>("Red");
显然,这些示例只是近似真实界面的样子。
使用诸如泛型、lambda 和表达式树之类的语法糖,C# 是否可以做到这一点?
我搜索了是否有人尝试过这样的事情,但只找到了一两个关于该主题的不完整系列博客文章。在我看来,如果可能的话,将会有一个完整的示例或一个开源或商业库可用。
【问题讨论】:
-
我不明白为什么它不可能。
-
@MarcinJuraszek:请给出答案,以便我们投票。 :-) ...除了开玩笑,你对这个问题有什么期待?是的,这似乎是可能的。您是否希望有人为它脱口而出整个代码?这是相当多的工作。
-
当然不是。我没有要求任何人“给我密码”。我希望得到确认(你已经给出了),我不会浪费我的时间来尝试这个,并且可能是一个链接到某人已经开创了这个想法的文章或图书馆。
标签: c# generics expression-trees builder