2017-09-26 61 views
0

对不起,如果这个标题不是很明确,不知道如何描述我在找什么,这无助于做适当的研究。通过方法调用子对象轻松构建

所以,我目前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问我,他们可以更快地使用这些巨大的成功者调用,这就是为什么我试着做到这一点。

最后,对不起我的英文。

+0

多少嵌套的层次,你想支持?是否有某些呼叫表明他们自己的“结束小组”? – CodeCaster

+0

其实它可以是无限的...你可以有自己的子对象... 这是一个查询的构造,唯一的方法来知道什么时候end sub必须出现是当用户停止添加对它的调用。 只有当开发者认为他的查询结束后才能执行它。 –

+0

这里的惯用解决方案是为所有这些操作使用属性,而不是方法。 – Servy

回答

0

只让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(); 
+0

那么这怎么比OP的第一个解决方案好? – Servy

+0

谢谢,是的,我试图回答你的答案,但你可以按下输入前删除它。 这看起来很有趣,我想它回答我的问题,我会稍后再尝试,如果我需要更多信息,请回到这里。我把这个作为答案。 –

+0

@Servy其实它回答技术问题 我也很乐意看到使用,阅读和理解是多么容易。 我没有测试它,但它似乎比迄今为止我所知道的要好:)我会稍后测试,然后再回过头来反馈:) –