我想根据'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 [](例如)
答案 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)
时,你似乎失去了大部分的价值。