Проверка IEnumerable с отражением

РЕДАКТИРОВАТЬ

Простая версия этого вопроса: если у меня есть какой-то объект o , как мне проверить, принадлежит ли o какой-то тип, реализующий IEnumerable с отражением ? Исходный вопрос гораздо более конкретен, но ответ на приведенный выше был бы столь же хорош. Извините, если я дал слишком много подробностей по этому вопросу

КОНЕЦ РЕДАКТИРОВАНИЯ

Ниже приводится надуманный объект ValueInjecter POC. Все работает хорошо, кроме метода isCollectionMapping в самом низу. Я' m пытается заставить его вернуть истину тогда и только тогда, когда и исходное, и целевое свойство являются объектами, реализующими IEnumerable .

Я пробовал IsAssignableFrom , а также IsInstanceOfType , но, похоже, ни один из них не работает.

Все остальное работает, поскольку, когда я раскомментирую вторую строку метода для явной проверки свойств имени «Дети», он работает нормально.

Примечание - Я знаю, что с этим примером есть проблемы. А именно, я пытаюсь проверить наличие старых 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";
    }
}
14
задан Adam Rackis 6 April 2011 в 14:20
поделиться