Создать список типов ссылок (объектов) из исходного списка
Я использовал следующий код для создания нового экземпляра определенного типа назначения с использованием исходного объекта, где я скопировал все значения свойств примитивного типа из исходного объекта в целевой объект:
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;
}
Надеюсь это поможет.