通过方法调用轻松构建子对象
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();
抱歉,如果这个标题不是很明确,我真的不知道如何描述我正在寻找的东西,这无助于进行适当的研究。
所以,我目前正在开发一个 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();