可以使用字符串中包含的System.Type名称来调用该类型的泛型函数吗?

时间:2018-04-24 01:58:55

标签: .net vb.net generics types

我有以下通用功能:

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来进行正确调用的方法。

1 个答案:

答案 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),其中ToTypeArguments

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)