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

.net casting dapper runtime vb.net

我已经看了几十个答案,和3 他们似乎真的接近我想要实现的。

我有一个包含数百个视图的数据库。我使用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)

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

我正在阅读更多有关泛型类型的内容 ,看看我是否可以让编译器识别出Query(Of ViewType)的类型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 。我完全迷失了如何定义它,如果它是可能的,或者我应该废弃整个方法。

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

一般承认的答案

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

 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)


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因