很抱歉,如果这个标题不是非常明确的,那么我真的不知道如何描述我正在寻找的东西,这对做适当的研究没有帮助。
所以,我现在正在开发一个将在稍后的大项目中使用的DLL。
我希望这个DLL使用一个对象作为输入:
SQuery _query = new SQuery()
.addText("text")
.addValue("2");
我可以很容易地通过"返回这个"在这个对象的每个方法中。
然后我想添加另一个应该像这样工作的函数:
//Creation of the main object
SQuery _query = new SQuery()
.addText("text")
.addValue("2");
//Creation of the subobject
SSub _sub = new SSub()
.addTest("test")
.addValue(3);
//Adding subobject to main object
_query.AddSub(_sub)
.addTitle("title");
现在我想知道是否有一种代码方式可以让它更容易使用,我首先这样做了:
SQuery _query = new SQuery()
.addText("text")
.addValue(2)
.addSub(new SSub().addTest("test").addValue(3))
.addTitle("title");
现在我想更进一步,我不知道哪种语法应该是正确的,而且我找不到任何语法,但我正在寻找可以在不需要用户的情况下使用的东西。实现这样的对象:
SQuery _query = new SQuery()
.addText("text")
.addValue(2)
.addSub()(this.addtest("test").addValue(3)) //or something like that
.addTitle("title");
我知道我可能错了,为了尽可能方便地使用它并不是一个好主意我也许应该留在前面的例子中,这样更容易编码和还是很容易使用。但无论如何,如果有人知道解决方案,我想要别人的意见。
对我来说这是不可能的,唯一的方法就是这样做,但感觉非常糟糕的是让我的子对象addTest()& addValue()自己撤回子对象实例,然后在子对象中有一个返回主对象的endSub()方法,如下所示:
SQuery _query = new SQuery()
.addText("text")
.addValue(2)
.addSub()
.addTest("test")
.addValue(3)
.endSub()
.addTitle("title")
但使用此功能,您无法查看子对象的开始位置和结束位置。
我并不喜欢那些成功的方法调用,而且我觉得放松阅读代码却感觉不舒服,但是有些人在以前的版本中使用我的DLL问我,他们可以更快地使用那些大量的成功调用&# 39;为什么我试图实现这个目标。
最后,抱歉我的英语。
答案 0 :(得分:0)
让AddSub
接受Action<SSub>
。
在AddSub
内创建sub,在其上调用操作,将其添加到subs列表并返回this
。
一个例子:
public class SomeBuilder
{
private List<SubElementBuilder> subs = new List<SubElementBuilder>();
public SomeBuilder AddSub(Action<SubElementBuilder> action)
{
var sub = new SubElementBuilder();
action(sub);
this.subs.Add(sub);
return this;
}
public string S { get; set; }
public SomeBuilder Another()
{
this.S = "Success";
return this;
}
}
public class SubElementBuilder
{
private int someValue;
public SubElementBuilder SetInteger(int i)
{
this.someValue = i;
return this;
}
public SubElementBuilder Another()
{
return this;
}
}
电话:
SomeBuilder builder = new SomeBuilder()
.AddSub(sub => sub.SetInteger(5).Another())
.Another();