Как создать список <неизвестный тип во время компиляции> и скопировать элементы через System.Reflection.PropertyInfo - PullRequest
3 голосов
/ 27 апреля 2011

Я столкнулся с чем-то довольно сложным. Я был бы признателен, если кто-то может помочь.

1) Я должен создать список <> неизвестного типа во время компиляции. Этого я уже достиг.

 Type customList = typeof(List<>).MakeGenericType(tempType);
 object objectList = (List<object>)Activator.CreateInstance(customList);

"temptype" - это пользовательский тип, который уже получен.

2) Теперь у меня есть PropertyInfo объект, который является тем списком, из которого мне нужно скопировать все элементы в только что созданный экземпляр "objectList"

3) Затем мне нужно выполнить итерацию и получить доступ к элементам «objectList», как если бы это был «System.Generic.List».

Короче говоря, используя отражение, мне нужно извлечь свойство, являющееся списком, и использовать его в качестве экземпляра для дальнейшего использования. Ваши предложения будут оценены. Заранее спасибо.

Umair

Ответы [ 3 ]

9 голосов
/ 27 апреля 2011

Многие классы универсальных коллекций .NET также реализуют свои неуниверсальные интерфейсы.Я бы использовал их для написания вашего кода.

// Create a List<> of unknown type at compile time.
Type customList = typeof(List<>).MakeGenericType(tempType);
IList objectList = (IList)Activator.CreateInstance(customList);

// Copy items from a PropertyInfo list to the object just created
object o = objectThatContainsListToCopyFrom;
PropertyInfo p = o.GetType().GetProperty("PropertyName");
IEnumerable copyFrom = p.GetValue(o, null);
foreach(object item in copyFrom) objectList.Add(item); // Will throw exceptions if the types don't match.

// Iterate and access the items of "objectList"
// (objectList declared above as non-generic IEnumerable)
foreach(object item in objectList) { Debug.WriteLine(item.ToString()); }
0 голосов
/ 03 июня 2013

Я придумал что-то подобное.Я позаимствовал метод SetProperties() у NullSkull и написал простой метод, который вызывает NullSkull SetProperties():

    public static List<U> CopyList<T, U>(List<T> fromList, List<U> toList)
    {
        PropertyInfo[] fromFields = typeof(T).GetProperties();
        PropertyInfo[] toFields = typeof(U).GetProperties();
        fromList.ForEach(fromobj =>
        {
            var obj = Activator.CreateInstance(typeof(U));
            Util.SetProperties(fromFields, toFields, fromobj, obj);
            toList.Add((U)obj);
        });

        return toList;
    }

... поэтому с помощью одной строки кода я могу получитьList<desired class> заполняется соответствующими значениями по имени из List<source class> следующим образом:

List<desired class> des = CopyList(source_list, new List<desired class>());

Что касается производительности, я не проверял ее, поскольку мои требования требуют небольших списков.

0 голосов
/ 27 апреля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...