Как использовать Reflection, чтобы установить свойство с типом списка <CustomClass> - PullRequest
3 голосов
/ 21 августа 2009

Уже есть похожий вопрос , но, похоже, он не спрашивал о ситуации, о которой идет речь.

Пользователь спросил о пользовательских классах в списке, но его объект списка имеет тип string.

У меня есть класс Foo со списком баров:

    public class Foo : FooBase
    { 
       public List<Bar> bars {get; set;} 
       public Foo() {}
    }

    public class Bar
    {
       public byte Id { get; set; } 
       public byte Status { get; set; } 
       public byte Type { get; set; } 
       public Bar(){} 
    }

Я создаю экземпляр Foo, используя отражение через Activator.CreateInstance (). Теперь мне нужно заполнить этот список баров объектами Bar.

Foo получается с использованием

Assembly.GetAssembly(FooBase).GetTypes().Where(type => type.IsSubclassOf(FooBase));

Бар - это открытый класс в той же Ассамблее. Мне нужно как-то добраться до этого типа. Кажется, я не вижу, какой тип списка содержится в Foo. Я знаю, что это список, хотя Я вижу свойство списка как List`1.

Мне нужно посмотреть, какой тип объекта содержится в списке, и обработать его соответствующим образом.

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

текст

List`1

- это способ, которым дженерики пишутся под капотом, что означает «Список с 1 универсальным типом arg, он же List<>». Если у вас есть PropertyInfo, вы должны быть установлены; это будет закрытый родовой List<Bar>. Это то, что вы хотите найти Bar данное просто это?

Если это так, это обсуждается в различных вопросах, включая этот ; дублировать бит ключа (я предпочитаю кодировать против IList<T>, поскольку он обрабатывает несколько крайних случаев, таких как , наследуя от List<T>):

static Type GetListType(Type type) {
    foreach (Type intType in type.GetInterfaces()) {
        if (intType.IsGenericType
            && intType.GetGenericTypeDefinition() == typeof(IList<>)) {
            return intType.GetGenericArguments()[0];
        }
    }
    return null;
}
2 голосов
/ 21 августа 2009
var prop = footype.GetProperty("bars");
// In case you want to retrieve the time of item in the list (but actually you don't need it...)
//var typeArguments = prop.PropertyType.GetGenericArguments();
//var listItemType = typeArguments[0];
var lst = Activator.CreateInstance(prop.PropertyType);
prop.SetValue(foo, lst, null);
...