2017-09-26 63 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其實它回答技術問題 我也很樂意看到使用,閱讀和理解是多麼容易。 我沒有測試它,但它似乎比迄今爲止我所知道的要好:)我會稍後測試,然後再回過頭來反饋:) –