2011-04-05 67 views
2

我很新的自动映射,甚至更新的ValueInjecter。如果这是一个简单的问题,我很抱歉,但我似乎无法在任何地方找到答案。ValueInjecter - 递归映射

我该如何做一个递归映射?例如,下面是一个映射主题(从我的数据服务)我目前的工厂方法到SubjectViewModel:

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,所以如果有人能指出我正确的方向,我会很感激!

这里有一个假的,但完整的代码示例:

[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

太好了,谢谢! – 2011-04-06 13:52:11