在运行时转换Typed Arrays

时间:2013-12-16 15:08:51

标签: .net vb.net list

我想根据'convertToType'或'myElementType'中声明的类型创建一个Collection。它必须是一个打字的集合(我需要进一步使用)。我不想要一个Untyped集合。

到目前为止我尝试的是

Dim field As PropertyInfo
'_attribute is the name of the property
field = doc.GetType().GetProperty(_attribute)
Dim convertToType As Type = field.PropertyType
Dim myElementType As Type = convertToType.GetElementType()

我试过了:

Dim myList as List(Of convertToType)
Dim myList as List(Of convertToType.GetType())

使用数组进行不同的尝试。但它不起作用。我在这里做错了什么?

显然,一些额外的信息是有序的。我的错 :) 该方法看起来像这样(我使它变得更小和简化):

_attribute:属性的名称 Me.Value:从超类继承的属性(指用户选择的值)是一个数组[Object]

Public Overridable Overloads Sub GetData(ByRef doc As ClassA)

    Dim fieldOperator As PropertyInfo
    Dim value() As String
    fieldOperator = doc.GetType().GetProperty("operator_" & _attribute)
    fieldOperator.SetValue(doc, Me.[Operator], Nothing)
    If Me.[Operator] <> Proxy.EasyExploreServices.SearchOperator.NoSearch Then
        Dim field As PropertyInfo

        field = doc.GetType().GetProperty(_attribute)
        Dim convertToType As Type = field.PropertyType
        Dim myElementType As Type = convertToType.GetElementType()

        // DO SOME CONVERSION
        Dim arrListObject As ArrayList = New ArrayList()
        For Each myObj As Object In Me.Value
            If (myElementType Is Nothing) Then
                arrListObject.Add(Convert.ChangeType(myObj, convertToType))
            Else
                arrListObject.Add(Convert.ChangeType(myObj, myElementType))
            End If
        Next
        // END CONVERSION

        field.SetValue(doc, // My New Collection //, Nothing)

    End If
End Sub

代码中的问题(如果没有进行转换)。其他类型的字符串抛出异常,因为例如Object []无法转换为Int [](例如)

1 个答案:

答案 0 :(得分:2)

首先,您需要获取通用Type类的List(Of T)对象。你可以这样做:

Dim genericType As Type = GetType(List(Of ))

请注意,省略了type参数。接下来,您需要获取Type的{​​{1}}对象,其中List(Of T)T描述的任何类型。为此,您可以使用convertToType方法,如下所示:

MakeGenericType

现在您拥有Dim specificType As Type = genericType.MakeGenericType({GetType(convertToType)}) 对象,您可以创建它的实例。例如:

Type

很难说这种事情在哪里会非常有用。通常,使用通用列表的值是您在编译时获得添加的类型检查的安全性。当你通过反射创建它,然后以后期方式使用它Dim myInstance As Object = Activator.CreateInstance(specificType) 时,你似乎失去了大部分的价值。