我有以下通用功能:
Public Function Add(Of T As Structure)(sKey As String) As CItem(Of T)
End Function
和一个包含System.Type名称的字符串,例如System.Int64
(但它可能是另一个Structure
类型)。
当此信息仅包含在字符串中时,是否可以在Add
被解释为T
时调用System.Int64
?
我被困在这里:
Dim oItem As CItem(Of x) = Add(Of x)
并且无法找到插入x来进行正确调用的方法。
答案 0 :(得分:0)
我们需要使用反射构造泛型类型CItem
的实例。由于该类是通用的,因此必须使用T
为其唯一的泛型类型参数MakeGenericType
指定新类型。
sType是指定类型的字符串。另一个字符串是为完整性指定的,它包含函数的参数。
Dim sType As String = "System.Int64"
Dim sKey As String = "MyKey"
获取虚拟文件类的泛型类型对象。请注意未指定泛型类型的用法。在我们的例子中,oGenericType.Name
确实返回" CItem 1" (and
oGenericType.IsGenericType`确实返回True。
Dim oGenericType As Type = GetType(CItem(Of))
创建一个类型参数数组,该数组与CItem
的类型参数数组匹配正确数量的类型(顺序相同)。 CItem
类仅指定1个参数(T)。所需类型存在于字符串sType
中。
Dim oTypeArguments() As Type = {Type.GetType(sType)}
现在可以构建一个类型(不是对象)CItem(Of T)
,其中T
是oTypeArguments
。
Dim oType As Type = oGenericType.MakeGenericType(oTypeArguments)
要创建CItem(Of T)
T
的实例,如oType
所示,Activator.CreateInstance(oVFType)
现在可以调用,但前提是有无参数构造函数。但是,没有:CItem
需要一个字符串。所以我们创建了一个类CItem(Of T)(sKey)
的实例。请注意,这会执行实例的New(sKey As String)
构造函数。
Dim oInstance As Object = Activator.CreateInstance(oType, sKey)
注意,第二个参数实际上是一个数组,所以如果你的函数只需要1个参数,那么指定它:
'Dim oInstance As Object = Activator.CreateInstance(oType, {sKey, Arg2, Arg3, ...})
我们处于同一点,好像我们用
实例化了一个新的CItem
对象
'Dim oItem = New CItem(Of Long)(sKey)