РЕДАКТИРОВАТЬ
Базовая версия этого вопроса: если у меня есть object o
, как бы я проверил, если o имеет какой-то тип, который реализует IEnumerable<string>
с отражением ?Оригинальный вопрос гораздо более конкретен, но ответ на вышесказанное был бы столь же хорош.Извините, если я дал слишком много подробностей по этому вопросу
КОНЕЦ РЕДАКТИРОВАНИЯ
Следующее является надуманным ValueInjecter POC.Все работает хорошо, за исключением метода isCollectionMapping
в самом низу.Я пытаюсь заставить его возвращать true, если и только если свойство source и target является любым объектом, который реализует IEnumerable<respectiveTypes>
.
Я пробовал IsAssignableFrom
, а также IsInstanceOfType
, но никажется, работает.
Все остальное работает, так как, когда я раскомментирую вторую строку метода, чтобы явно проверить свойства имени "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";
}
}