在VB.Net中为属性创建和分配泛型类型列表

时间:2012-08-13 15:34:20

标签: vb.net generics

我有一个问题,经过几天的研究后我无法解决......

我必须创建一个读取Excel文件的应用程序,并根据列的名称和值生成对象,以便测试其他应用程序。这部分没有问题,我可以在不知道其类型的情况下创建并为我的对象赋值。

我遇到的问题是其中一些对象之间存在关系,因为对象A有一个List(Of Object B)。我可以识别这些。

我的对象声明如下:

Public Class Person
     Public Property Name as String
     Public Property Age as Integer
     Public Property Dogs as List(Of Dog)
     ...
End Class

Public Class Dog
     Public Property Name as String
     ...
End Class

当我进行debbug时,我会得到类似的东西: 人:姓名=“某事”,年龄= 30,狗=没什么

由于我的List(Of T)等于什么,我需要在将对象添加到其中之前对其进行实例化。由于我还没有找到任何方法告诉List实例化自己,我试图为该属性分配一个新列表。

我尝试了一些代码:

'In this case, unObjetParent would be a Person, and unObjetEnfant would be a Dog
Private Function AssocierObjets(ByRef unObjetParent As Object, ByRef unObjetEnfant As Object) As Boolean
    Dim proprietes() As Reflection.PropertyInfo = unObjetParent.GetType.GetProperties
    Dim typeEnfant As Type = unObjetEnfant.GetType

    For Each p As Reflection.PropertyInfo In proprietes
        If p.PropertyType.Name.Equals("List`1") Then
            Dim type As Type = p.PropertyType
            Dim splittedAssemblyQualifiedName As String() = type.AssemblyQualifiedName.Split(","c)
            Dim typeOfList As Type = type.GetType(splittedAssemblyQualifiedName(0).Substring(splittedAssemblyQualifiedName(0).LastIndexOf("["c) + 1))
            ' ^ The way I found to get the Type of the GenericArgument of the List before instantiating it.

            If typeOfList = typeEnfant Then

                'This create a object with it's name, in this case, it returns a Dog
                Dim prototype = DefinirObjet(typeOfList.Name)

                'My first try, it returns a List(Of VB$AnonymousType_0`1[System.Object])
                'which I can't convert into a List(Of Dog(for this example))
                Dim prop = New With {unObjetEnfant}
                Dim l = prop.CreateTypedList
                p.SetValue(unObjetParent, l, Nothing)

                'This one doesn't work either as it returns a List(Of Object)
                'which I can't convert into a List(Of Dog(for this example))
                p.SetValue(unObjetParent, CreateTypedList2(prototype), Nothing)

            End If
        End If
    Next
    Return True
End Function

<System.Runtime.CompilerServices.Extension()> _
Function CreateTypedList(Of T)(ByVal Prototype As T) As List(Of T)
    Return New List(Of T)()
End Function

Private Function CreateTypedList2(Of T)(ByVal unPrototype As T) As List(Of T)
    Return New List(Of T)
End Function

另外,我无法修改对象,因为我应该能够接受我们需要测试的任何对象库。

这可能吗?我需要解决这个问题。提前致谢

P.S。对不起,如果我的英语不好,那不是我的母语。

1 个答案:

答案 0 :(得分:0)

最后,我找到了一种方法来做我需要的事情:

      Dim t1 As Type = GetType(List(Of ))
      Dim constructed As Type = t1.MakeGenericType(typeEnfant)
      Dim o As Object = Activator.CreateInstance(constructed)

这创建了一个泛型集合的实例,在我的例子中是指定类型的List(Of T),我可以将它作为我正在处理的属性。