是否有可能以动态方式调用.NET Generics?

时间:2011-10-28 10:54:43

标签: .net vb.net generics dynamic

已修改实体名称以保护其身份......

我创建了一个名为AnimalSearch的类(Of AnimalType As Animal(Of Int32))

Public Class AnimalSearch(Of AnimalType As Animal(Of Int32))

End Class

我可以这样称呼这个类:

Dim s As New AnimalSearch(Of Monkey)()

但是,我在电话会议时不知道“猴子”会是什么类型。

我一直在尝试以下设置,但似乎无法到达任何地方:

Public Shared Function GetAnimalSearchResults(criteria As SearchCriteria, animalType As Type) As SearchResults
    Dim s As New AnimalSearch(Of animalType)()
    ' ... (etc.)
End Function

然后我从另一个班级打电话给我:

Dim results As SearchResults = GetAnimalSearchResults(criteria, GetType(Monkey))

在其他地方,我可能会打电话:

Dim results As SearchResults = GetAnimalSearchResults(criteria, GetType(Giraffe))

这是构造函数(Dim s As New AnimalSearch(Of animalType)()),这就是问题所在。它可以使用以下稍微简单的代码进行复制:

Dim t As Type = GetType(Monkey)
Dim s As New AnimalSearch(Of t)()

有可能做我想做的事吗?

2 个答案:

答案 0 :(得分:1)

这里解释了泛型: http://msdn.microsoft.com/en-us/library/w256ka79.aspx

它有一个优势:

  

类型安全。通用类型强制执行编译时类型检查。基于Object的类型接受任何数据类型,您必须编写代码来检查输入数据类型是否可接受。对于泛型类型,编译器可以在运行时捕获类型不匹配。

所以我不希望以你尝试的方式工作,因为在你的例子中,编译不知道你要为哪个类型创建泛型(当你通过{{1读取类型时) }} 方法)。

但是,不是动态创建泛型,而是可以创建基类(或接口)类型的Generic。

修改

以下为例:

GetType

答案 1 :(得分:1)

你不能像在.NET中那样混合运行时和编译时,但你可以通过使用开放的泛型类型来实现:

Dim s As IAnimalSearch = Activator.CreateInstance (
    GetType (AnimalSearch (Of )).MakeGenericType (animalType))

您必须为AnimalSearch (Of T)提供非通用接口(我称之为IAnimalSearch),以便能够操作它。