通过方法调用子对象轻松构建
对不起,如果这个标题不是很明确,不知道如何描述我在找什么,这无助于做适当的研究。通过方法调用子对象轻松构建
所以,我目前devlopping一个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()returing自己的子对象实例,然后在子对象中有一个endSub()方法返回像这样的主要对象:
SQuery _query = new SQuery()
.addText("text")
.addValue(2)
.addSub()
.addTest("test")
.addValue(3)
.endSub()
.addTitle("title")
但是使用这个,你看不到的地方启动子对象,并在那里结束。
我并不是那些成功者调用方法的粉丝,我觉得很容易阅读代码,但有些人在以前的版本中使用我的DLL问我,他们可以更快地使用这些巨大的成功者调用,这就是为什么我试着做到这一点。
最后,对不起我的英文。
只让AddSub
接受Action<SSub>
。 在AddSub
里面创建子,调用它的动作,将它添加到子列表并返回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();
那么这怎么比OP的第一个解决方案好? – Servy
谢谢,是的,我试图回答你的答案,但你可以按下输入前删除它。 这看起来很有趣,我想它回答我的问题,我会稍后再尝试,如果我需要更多信息,请回到这里。我把这个作为答案。 –
@Servy其实它回答技术问题 我也很乐意看到使用,阅读和理解是多么容易。 我没有测试它,但它似乎比迄今为止我所知道的要好:)我会稍后测试,然后再回过头来反馈:) –
多少嵌套的层次,你想支持?是否有某些呼叫表明他们自己的“结束小组”? – CodeCaster
其实它可以是无限的...你可以有自己的子对象... 这是一个查询的构造,唯一的方法来知道什么时候end sub必须出现是当用户停止添加对它的调用。 只有当开发者认为他的查询结束后才能执行它。 –
这里的惯用解决方案是为所有这些操作使用属性,而不是方法。 – Servy