首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueInjecter -递归映射

ValueInjecter -递归映射
EN

Stack Overflow用户
提问于 2011-04-05 18:30:38
回答 1查看 1.2K关注 0票数 1

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

我将如何进行递归映射?例如,下面是我当前的工厂方法,它将主题(从我的数据服务)映射到SubjectViewModel:

代码语言:javascript
复制
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来说是一种简单的情况,所以如果有人能给我指明正确的方向,我会很感激的!

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

代码语言:javascript
复制
[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.Collections.Generic.List`1TestValueInjector.SubjectViewModel‘类型的

System.ArgumentException:不能转换为'System.String'.

类型

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-06 07:08:11

之所以会出现此错误,是因为您将源属性子属性与目标对象中的所有属性匹配,因此调用了所有匹配项的SetValue。

你需要的是:

代码语言:javascript
复制
protected override bool Match(ConventionInfo c)
{
   return c.SourceProp.Name == c.TargetProp.Name 
          && c.SourceProp.Name == "Children";
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5556667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档