2011-04-05 4 views
2

저는 자동 매핑이 새롭고 ValueInjecter가 최신 버전입니다. 이것이 쉬운 질문이라면 유감이지만 어디서나 답을 찾을 수는없는 것 같습니다.ValueInjecter - 재귀 적 매핑

어떻게 재귀 적 매핑을 수행 할 수 있습니까? ,

private SubjectViewModel createSubject(DataService.SubjectResult s) { 
    SubjectViewModel result = new SubjectViewModel(); 
    result.SubjectName = s.SubjectName; 
    result.id = s.id; 

    foreach (DataService.SubjectResult sChild in s.Children) 
     result.ChildSubjects.Add(createSubject(sChild)); 

    return result; 
} 

내가 ValueInjecter이이 상황의 생계 유형 같은데요 예를 들어, 여기에 SubjectViewModel에 (내 데이터 서비스에서) 주제를 매핑 내 현재 공장 방법 그래서 누군가가 올바른 방향으로 나를 가리킬 수 있다면 나는 그것을 고맙게 생각할 것입니다! 여기

는 가짜지만, 전체 코드 샘플 :

[TestClass] 
public class UnitTest1 { 

    [TestMethod] 
    public void TestMethod1() { 
     Subject S = new Subject() { 
      id = 1, 
      SubjectName = "S1", Children = { new Subject() { id = 2, SubjectName = "S1a" }, 
              new Subject() { id = 3, SubjectName = "S1b" }} 
     }; 

     SubjectViewModel VM = new SubjectViewModel(); 
     VM.InjectFrom<CollectionToCollection>(S); 

     Assert.AreEqual(2, VM.Children.Count); 
    } 
} 


public class Subject { 
    public Subject() { 
     Children = new List<Subject>(); 
    } 

    public string SubjectName { get; set; } 
    public int id { get; set; } 

    public List<Subject> Children { get; private set; } 
} 

public class SubjectViewModel { 
    public SubjectViewModel() { 
     Children = new List<SubjectViewModel>(); 
    } 

    public string SubjectName { get; set; } 
    public int id { get; set; } 

    public List<SubjectViewModel> Children { get; set; } 
} 

public class CollectionToCollection : Omu.ValueInjecter.ConventionInjection { 
    protected override bool Match(ConventionInfo c) { 
     return c.SourceProp.Name == "Children"; 
    } 

    protected override object SetValue(ConventionInfo c) { 
     List<SubjectViewModel> result = new List<SubjectViewModel>(); 
     foreach (Subject S in (c.SourceProp.Value as IEnumerable<Subject>)) 
      result.Add(new SubjectViewModel()); 
     return result; 
    } 
} 

편집 - 나는 이것이 본래의 접근법은 알고, 그 재귀 아니다. 지금은 단지 지금까지 예외없이이를 얻으려고

는 지금은 얻을 :

System.ArgumentException : 개체 유형 'System.Collections.Generic.List`1 [TestValueInjector의 .SubjectViewModel] ' 을 'System.String '유형으로 변환 할 수 없습니다.

답변

2

이 오류가 발생하는 이유는 소스 속성 Children을 대상 개체의 모든 속성과 일치 시켜서 모든 일치 항목에 대해 SetValue가 호출 되었기 때문입니다. 당신이 필요로 무엇

이었다이 :

protected override bool Match(ConventionInfo c) 
{ 
    return c.SourceProp.Name == c.TargetProp.Name 
      && c.SourceProp.Name == "Children"; 
} 
+0

멋진, 감사합니다! –