2013-03-26 2 views
3

죄송합니다. 제목이 잘못되어 죄송합니다. 동일한 결과를 반환하는 하나 이상의 메서드가 있습니다.C# 익명 매개 변수를 전달 하시겠습니까?

List<JsonTreeView> FromReportTree(List<ReportTree> list) 
{ 
} 

초 방법

List<JsonTreeView> FromLocationTree(List<LocationTree> list) 
{ 
} 

이 다른 이들과는 ... 트리 모델의 특성은 다르다

public class JsonTreeView 
{ 
    public int id { get; set; } 
    public string text { get; set; } 
    public string state { get; set; } 
    public string @checked { get; set; } 
    public string attributes { get; set; } 
    public List<JsonTreeView> children { get; set; } 
} 

첫번째 방법 형 복귀. 예 :

LocationTree (id, name, parent, text) 
ReportTree (sno, name, parent, desc) 

이러한 모든 트리 모델에 대해 하나의 메소드를 작성할 수 있습니까? 어떤 제안이나 출발점입니까?

감사합니다 ...

+1

기술의 정확성에 대해 확실하지만 당신은 모든 '나무'클래스에서 상속 기본 클래스를 가질 수 및 다음의 목록을 전달할 수 없음 기본 클래스. '옳은'느낌은 아니지만 효과가 있습니다. –

+0

TreeModel은 DB 테이블로 표현됩니다.그래서 당신의 제안을한다면, 나는 추가 DTO 모델을 만들고 DB 테이블 모델로 다시 캐스팅해야합니다 ... –

답변

2

나는 당신이 지루하고 고된 일을하는 개인 방법을 제안하고, 다른 유형의 오버로드 된 메소드를 유지한다.

private List<JsonTreeView> FromReportTree<T>(List<T> list, Func<T, JsonTreeView> convert) { 
    // loop through the list and call convert to create items 
    List<JsonTreeView> result = new List<JsonTreeView>(); 
    foreach (T item in list) { 
    result.Add(convert(item)); 
    } 
    return result; 
} 

List<JsonTreeView> FromReportTree(List<ReportTree> list) { 
    return FromReportTree(list, t => new JsonTreeView(t.id, t.text, ...)); 
} 

List<JsonTreeView> FromReportTree(List<LocationTree> list) { 
    return FromReportTree(list, t => new JsonTreeView(t.sno, t.desc, ...)); 
} 
+0

나는이 것을 triying, 거의 당신이 제안하는 것을 이해, 감사합니다 ... –

0

귀하의 질문은 조금 혼란하지만 난 이해 생각 : 그 방법의 특정 개체에서 JsonTreeView 객체를 생성하는 기능으로, 다른 방법에서 개인 메서드를 호출합니다. 하나의 FromReportTree 함수가 필요합니다.

이렇게하려면 ReportTree와 LocationTree가 공통 기본 클래스를 갖기를 원할 것입니다. 마찬가지로 :

public abstract class ReportLocationTree { 
    public int id { get; set; } 
} 

public class ReportTree : ReportLocationTree { 
    public string moreStuff { get; set; } 
} 

public class LocationTree : ReportLocationTree { 
    public string evenMoreStuff { get; set; } 
} 

List<JsonTreeView> FromReportTree(List<ReportLocationTree> list) 
{ 
    list.Select(t => new JsonTreeView { id = t.id }).ToList(); 
} 

나는 당신이 serailizing 얼마나 확실하지 않았다, 그래서 난 내 코드에 포함하지 않았다, 그러나 serailized되고있어해서 그것이 당신의 특성에 다른 이름 지정 규칙을 따라야 나쁜 형태의 .

JSON.Net 당신에 꽤 쉽게 : http://james.newtonking.com/projects/json/help/index.html?topic=html/SerializationAttributes.htm

1

그것은 그 방법에 무슨 일에 따라 달라집니다. 당신은 다양한 트리 모델이 다른 속성을 가지고 있다고 말합니다. 메소드의 논리에 비 공통 속성이 필요합니까? 당신은 어떤 종류의 BaseTree 모델이 가정 그렇지 않으면 T : class

List<JsonTreeView> FromReportTree<T>(List<T> list) where T : BaseTree 
{ 
    //some logic 
} 

을하거나 (하지 않는 것이 좋습니다) 그를 떠나 : 그 방법의 각 논리가 같은 경우, 당신은이 작업을 수행 할 수 있습니다.

논리가 다른 경우에도 if (list is LocationTree)을 확인하고 그 논리를 사용하여 LocationTree에 해당하는 로직을 수행 할 수 있지만 그렇게하면 지저분해질 수 있습니다.

0

모든 나무를 인터페이스로 구현하면 가능합니다.

interface iMyTree 
{ 
    int MyTreeID {get; set;} 
    string MyTreePame {get; set;} 
    object MyTreeParent {get; set;} 
    string MyTreeText {get; set;} 
} 


class AnyTree : iMyTree 
{ 
    //any properties 

    //implements iMyTree 
} 

그리고 그 방법

List<JsonTreeView> FromMyTree(List<iMyTree> list) 
{ 
    //all trees that implement iMyTree will have the same methods, any kind of tree implementing iMyTree can be used. 
} 
관련 문제