通过方法调用轻松构建子对象

Easy construction of subobject by methods call

抱歉,如果这个标题不是很明确,我真的不知道如何描述我正在寻找的东西,这无助于进行适当的研究。

所以,我目前正在开发一个 DLL,稍后将在更大的项目中使用。

我希望此 DLL 使用 object 作为输入,如下所示:

SQuery _query = new SQuery()
.addText("text")
.addValue("2");

在这个 object 的每个方法中,我可以通过 "return this" 轻松完成。

然后我想添加另一个函数,它应该像这样工作:

//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");

现在我想更进一步,我不知道哪种语法应该是正确的,我也没有找到任何语法,但我正在寻找不需要用户实例化就可以使用的东西 object 像那样:

SQuery _query = new SQuery()
.addText("text")
.addValue(2)
.addSub()(this.addtest("test").addValue(3)) //or something like that
.addTitle("title"); 

我知道我可能错了,为了让一些东西尽可能易于使用并不是一个好主意,我也许应该继续使用前面的例子,它更容易编码而且仍然相当容易使用。但无论如何,我希望得到其他人的意见,以防有人知道解决方案。

对我来说这是不可能的,也是唯一的方法,但感觉很糟糕的是让我的 subobject addTest() & addValue() 自己返回 subobject 实例,然后在 subobject 中有一个 endSub() 方法,return main object 像这样:

SQuery _query = new SQuery()
.addText("text")
.addValue(2)
.addSub()
.addTest("test")
.addValue(3)
.endSub()
.addTitle("title")

但是使用这个你看不到子object从哪里开始和在哪里结束。

我不是那些连续调用方法的真正粉丝,我觉得阅读代码变得不那么容易了,但是一些在以前版本中使用我的 DLL 的人问我,使用那些大量的连续调用他们可以更快,这就是为什么我努力做到这一点。

最后,对不起我的英语。

就让AddSub接受一个Action<SSub>。 在 AddSub 内创建 sub,调用其上的操作,将其添加到 subs 列表和 return 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();