編集
この質問の最低限のバージョンは、もし私が持っているなら、oがリフレクションobject o
で実装されるタイプのものであるかどうかをどのようにチェックするのでしょうか?元の質問ははるかに具体的ですが、上記の答えも同様に良いでしょう。この質問について詳しく説明しすぎたら申し訳ありませんIEnumerable<string>
編集終了
以下は、考案されたValueInjecterPOCです。isCollectionMapping
一番下の方法を除いて、すべてがうまく機能します。ソースプロパティとターゲットプロパティの両方がを実装するオブジェクトである場合にのみ、trueを返そうとしていますIEnumerable<respectiveTypes>
。
私も試しましたが、どちらIsAssignableFrom
もうまくIsInstanceOfType
いかないようです。
メソッドの2行目をコメント解除して、「Children」という名前のプロパティを明示的にチェックすると、正常に機能するため、他のすべてが機能します。
注-この例には問題があることを私は知っています。つまり、私は古いものをチェックしようとしていますIEnumerable<>
が、それでも常に戻るのに十分なことを知っていList<>
ます。これは、現時点での概念実証にすぎません。
[TestClass]
public class UnitTest1 {
[TestMethod]
public void TestMethod1() {
List<string> strings = new List<string>();
Subject S = new Subject() {
id = 1,
SubjectName = "S1",
Children = { new Subject() { id = 2, SubjectName = "S1a" },
new Subject() { id = 3, SubjectName = "S1b", Children = { new Subject() { id = 4} } } }
};
SubjectViewModel VM = (SubjectViewModel)new SubjectViewModel().InjectFrom<CollectionToCollection>(S); ;
Assert.AreEqual(2, VM.Children.Count);
Assert.AreEqual(1, VM.Children.Single(s => s.id == 3).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; 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.TargetProp.Name == c.SourceProp.Name;
}
protected override object SetValue(ConventionInfo c) {
if (isCollectionMapping(c))
return (c.SourceProp.Value as IEnumerable<Subject>).Select(s => (SubjectViewModel)(new SubjectViewModel().InjectFrom<CollectionToCollection>(s))).ToList();
else
return c.SourceProp.Value;
}
private bool isCollectionMapping(ConventionInfo c) {
return c.SourceProp.Value.GetType().IsInstanceOfType(typeof(IEnumerable<Subject>)) && c.TargetProp.Value.GetType().IsAssignableFrom(typeof(IEnumerable<SubjectViewModel>));
//return c.SourceProp.Name == "Children" && c.TargetProp.Name == "Children";
}
}