从源列表创建引用类型List(Of Objects)

时间:2014-02-21 05:09:32

标签: .net system.reflection typedescriptor propertydescriptor system.type

我使用以下代码使用源对象创建特定目标类型的新实例,其中我将所有基本类型属性值从源对象复制到目标对象:

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)) 我怎样才能实现同样的目标?

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,那么你可以迭代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;
}

希望这有帮助。