0

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

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 

Теперь. У меня есть List (Of Class1) и вы хотите получить List (Of Class2), используя тот же общий подход. Здесь я хочу передать List (Of Class1) и тип назначения (т. Е. GetType (Class2)) Как я могу достичь того же?

ответ

0

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

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

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

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

EDIT:

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

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; 
} 

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

+0

Да, вы правы. Это может быть решение, но оно не является общим для всех типов списков, поскольку здесь вы кодируете «Список newlstClass2 = новый Список ();» который также я хочу сделать родовым, должен быть сделан на основе назначения Тип не «новый список ();». – binarymnl

+0

Проверьте обновленный ответ – samar