私は自動マッピングにかなり慣れておらず、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'に変換できません。