【问题标题】:Cast Class Type at Runtime in VB.NET在 VB.NET 运行时强制转换类类型
【发布时间】:2014-04-29 06:50:20
【问题描述】:

我看了几十个答案,threeofthem 似乎真的很接近我想要实现的目标。

我有一个包含数百个视图的数据库。我使用 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 未定义。我完全不知道如何定义它,如果它甚至可能,或者我是否应该放弃整个方法。

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

【问题讨论】:

    标签: .net vb.net casting runtime dapper


    【解决方案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)
    

    【讨论】:

    • 这解决了我的问题。我什至不使用通用函数感到愚蠢!现在我知道接下来要开始阅读什么主题了。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2021-01-24
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多