在VB.NET中运行时转换类类型

时间:2014-04-28 22:43:17

标签: .net vb.net casting runtime dapper

我查看过几十个答案,而three of them似乎与我想要达到的目标非常接近。

我有一个包含数百个视图的数据库。我使用dapper来查询视图的结果。我将结果呈现在网格中。这是一个只读操作。视图结果已映射到​​类。这是一个典型的查询:

queryResults = conn.Query(Of vw_EmployeeProductDetails)(queryString, Nothing)

现在,我对每个视图都有一个单独的查询(每个视图都在自己的函数中)。我希望将queryString和“ViewType”传递给单个函数以获得结果。

'pass Type as function parameter
Dim ViewType = GetType(vw_EmployeeProductDetails)
SelectView(queryString, ViewType)

'...

'in the generic query function:
queryResults = conn.Query(Of ViewType)(queryString, Nothing)

但是,这不会编译,我收到错误“未定义类型'ViewType'。”

我尝试过创建特定类的实例,然后传递该类型。我在多个配置中使用了Activator.CreateInstance。我尝试使用MakeGenericType。我尝试将结果明确地放在“ViewType”列表中:

Dim ViewType = GetType(List(Of )).MakeGenericType(GetType(vw_EmployeeProductDetails))
Dim list = Activator.CreateInstance(ViewType)
list = conn.Query(queryString, Nothing)

以上都没有(以及更多的死胡同)有效。上面的代码让我回到原点(一个通用的对象,不能轻易地在网格中显示,即使正确的属性都在那里,而不是将它扔回到数据集/数据表中)。

我正在阅读更多有关generic types的内容,看看我是否可以让编译器识别Query(Of ViewType)中的类型,但我仍然无法完全理解如何将它们放在一起或者如果这种方法可行(例如,我的所有ViewTypes都会从泛型类继承吗?)。

由于同样的原因,此代码无法编译:

Dim ViewType= GetType(List(Of )).MakeGenericType(GetType(vw_EmployeeProductDetails))
Dim list = Activator.CreateInstance(ViewType)
Dim list2() As List(Of ViewType)

创建list2时,未定义ViewType。我完全迷失了如何定义它,如果它是可能的,或者我应该废弃整个方法。

任何人都可以提供有关这是否可行的见解?如果是这样,我该如何实现它。如果没有,在这种情况下是否有合适的替代方案?

1 个答案:

答案 0 :(得分:1)

您的通用查询函数应接受泛型类型参数:

 Public Function MyQueryFunction(Of T)(queryString As String) As List(Of T)
    return conn.Query(Of T)(queryString, Nothing)
 End Function

你会这样称呼它:

  Dim myresults as List(Of vw_EmployeeProductDetails) = MyQueryFunction(Of vw_EmployeeProductDetails)(queryString)