Создать список типов ссылок (объектов) из исходного списка

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

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), используя тот же общий подход. Здесь я хочу передать List(Of Class1) и тип назначения (то есть GetType(Class2)). Как я могу достичь того же?

1 ответ

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

например (я помещаю код в C#, поскольку я немного слаб в 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;
}

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

Другие вопросы по тегам