【问题标题】:ValueInjecter - recursive mappingValueInjecter - 递归映射
【发布时间】:2011-04-06 15:08:11
【问题描述】:

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

如何进行递归映射?例如,这是我当前的工厂方法,将 Subject(来自我的数据服务)映射到 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'。

【问题讨论】:

    标签: automapping valueinjecter


    【解决方案1】:

    您收到此错误的原因是因为您将源属性 Children 与目标对象的所有属性相匹配,因此对所有匹配项调用 SetValue。

    你需要的是这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2011-07-24
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多