我对自动映射非常陌生,甚至对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.Collections.Generic.List`1TestValueInjector.SubjectViewModel‘类型的
System.ArgumentException:不能转换为'System.String'.
类型
发布于 2011-04-06 07:08:11
之所以会出现此错误,是因为您将源属性子属性与目标对象中的所有属性匹配,因此调用了所有匹配项的SetValue。
你需要的是:
protected override bool Match(ConventionInfo c)
{
return c.SourceProp.Name == c.TargetProp.Name
&& c.SourceProp.Name == "Children";
}https://stackoverflow.com/questions/5556667
复制相似问题