已修改实体名称以保护其身份......
我创建了一个名为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)()
有可能做我想做的事吗?
答案 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
),以便能够操作它。