2017-09-26 1 views
0

죄송합니다.이 제목이 분명하지 않은 경우 적절한 조사를 수행하는 데 도움이되지 않는 찾고자하는 것을 설명하는 방법을 모르십시오.메서드 호출로 하위 객체를 쉽게 생성 할 수 있습니다.

그래서 더 큰 프로젝트에서 나중에 사용할 DLL을 devlopping하고 있습니다. 내가 쉽게 할 수

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

이 개체의 각 방법에서 "이 반환"

나는이 DLL이 같은 입력으로 객체를 사용하고 싶습니다.

가 그럼 난 이런 식으로 작동합니다 다른 기능을 추가 할 :

지금은 쉽게 사용할 수 있도록 수있는 코드 할 수있는 방법이 있는지 궁금 해요
//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

얼마나 많은 수준 당신이 지원하고자합니까? 자신의 "end sub"를 나타내는 특정 호출이 있습니까? – CodeCaster

+0

실제적으로 무제한 일 수 있습니다 ... 하위 개체가있을 수 있습니다 ... 최종 하위 항목을 표시해야하는시기를 알 수있는 유일한 방법은 쿼리 작성입니다. 사용자가 해당 항목에 대한 호출을 중지하는 경우입니다. 개발자가 쿼리가 종료되었다고 생각하면 실행할 수 있습니다. –

+0

여기서 관용적 인 해결책은 메서드가 아닌 이러한 모든 작업에 대한 속성을 사용하는 것입니다. – Servy

답변

0

AddSubAction<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 실제로 기술적 인 질문에 대답합니다. 나는 읽고 사용하고 이해하는 것이 얼마나 쉬운 지에 대한 의견도 공개하고 있습니다. 나는 그것을 테스트하지 않았지만 지금까지 내가 알고있는 것보다 낫다고 생각합니다. 나는 나중에 테스트하고 피드백으로 돌아올 것입니다. –

관련 문제