Создать ссылочный тип List(Of Objects) из исходного списка

Я использовал следующий код для создания нового экземпляра определенного целевого типа с использованием исходного объекта, где я скопировал все значения свойств примитивного типа из исходного объекта в целевой объект:

Function GetDestinationObjectFromSourceObject(pSourceObject As Object, pDestinationType As Type) As Object
            Dim oDestinationObject = Activator.CreateInstance(pDestinationType)

            For Each oPropertyDescriptor As PropertyDescriptor In TypeDescriptor.GetProperties(pSourceObject)
                If TypeDescriptor.GetProperties(oDestinationObject).Contains(oPropertyDescriptor) Then
                    TypeDescriptor.GetProperties(oDestinationObject).Item(oPropertyDescriptor.Name).SetValue(oDestinationObject, oPropertyDescriptor.GetValue(pSourceObject))
                End If
            Next

            Return oDestinationObject
End Function

Теперь. У меня есть список (класса 1) и я хочу получить список (класса 2), используя тот же общий подход. Здесь я хочу передать список (класса 1) и тип назначения (например, GetType (класс 2)) Как я могу добиться того же?


person binarymnl    schedule 21.02.2014    source источник


Ответы (1)


Если я правильно понимаю вашу проблему, вы можете перебрать список (класса 1) и передать каждый объект этому методу и добавить объект, который возвращается в новый список (класса 2).

например (я добавляю код на С#, так как я немного слаб в vb.net, но преобразование его в vb.net не должно быть для вас проблемой)

Если это не то, что вам нужно, перефразируйте свой вопрос.

List<Class2> newlstClass2 = new List<Class2>();
foreach(Class1 item in lstClass1)
{
    newlstClass2.Add(GetDestinationObjectFromSourceObject(item, typeof(Class2)));
}

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

Ниже приведен общий метод для вашего требования. Я предполагаю, что классы имеют конструктор без параметров. Я немного протестировал его со своей стороны. Пожалуйста, проведите тщательное тестирование и с вашей стороны.

public List<U> GenerateList<T, U>(List<T> lst)
{
    List<U> newLst = new List<U>();

    foreach (var item in lst)
    {
        U obj = Activator.CreateInstance<U>();
        foreach (PropertyInfo item2 in item.GetType().GetProperties())
        {
            if (obj.GetType().GetProperty(item2.Name) != null)
            {
                obj.GetType().GetProperty(item2.Name).SetValue(obj, item2.GetValue(item, null), null);
            }
        }

        newLst.Add(obj);
    }

    return newLst;
}

Надеюсь это поможет.

person samar    schedule 21.02.2014
comment
Да, ты прав. Это может быть решением, но оно не является универсальным для всех типов списков, так как здесь вы кодируете List‹Class2› newlstClass2 = new List‹Class2›(); который также я хочу сделать универсальным, должен быть выполнен на основе типа назначения, а не нового списка‹Class2›();. - person binarymnl; 21.02.2014