通用表单对象中的VB.Net访问变量

时间:2015-04-17 13:02:52

标签: vb.net vb6

我的公司已经让我开始了一个紧急项目,将我们现有的程序从VB6更新到VB.Net。这发生在两个阶段,第一个我个人认为浪费时间,但它坚持要完成,是在Visual Studio中使用转换过程,然后清理错误只是为了获得编译版本。程序的大小是巨大的,但由于我现在没有发言权,我正试图解决数百个编译器错误。我确实意识到我所做的并不是最佳实践,而是一种令人沮丧的情况/浪费时间。

基本上有许多表单,其中一种表单可以调用任何数量的其他表单,这些表单由If语句指定。加载表单时,新表单中的变量将被分配并打开。有些变量通常是命名的,有些则不是。所以在VB6代码中它看起来像这样:

Dim frm As System.Windows.Forms.Form
If x=y Then
 frm = New frm1
 frm.Variable1 = "VarA"
 frm.Variable2 = "VarB"
Else
 frm = New frm2
 frm.Variable3 = "VarC"
 frm.Variable4 = "VarD"
End If
frm.Variable5 = "VarE"

我玩弄了在If语句中放置一个单独的表单对象,但是因为它们也需要在它之外,它并没有真正解决问题,并且由于通用项目在很多方面被用于其他方面,所以它不会在单独的作业中复制它们是不切实际的。

我希望能有一个快速的解决方案

frm.Var("Variable1") = "VarA"

但是我找不到任何可以在如此大的条件下实施的东西。

抱歉不鼓励最佳实践,因为我确实认识到任何解决方案都不会,但我正在寻找最快的实现,以便我可以继续重写整个程序。

1 个答案:

答案 0 :(得分:1)

丑陋但最简单的解决方案是将行Option Strict Off添加到执行此类操作的任何文件的顶部。当Option Strict关闭时,VB.NET将执行与VB6相同的后期绑定操作。如果在运行时发现成员名称无效,它将抛出异常,但只要该成员存在且具有预期的签名,它就会起作用。在我看来,这通常是不好的做法,但在这种情况下,有时可以保证。

作为旁注,当你有Option Strict Off时,它实际上正在做的是使用reflection按指定名称查找成员。从技术上讲,你可以自己动手使用反射,但它需要更多的代码来做同样的事情,这正是你似乎试图避免的。

如果您不想这样做,可以使用CTypeDirectCast将对象强制转换为特定类型。例如:

Dim frm As System.Windows.Forms.Form
If x=y Then
    frm = New frm1
    DirectCast(frm, frm1).Variable1 = "VarA"
    DirectCast(frm, frm1).Variable2 = "VarB"
Else
    frm = New frm2
    DirectCast(frm, frm2).Variable3 = "VarC"
    DirectCast(frm, frm2).Variable4 = "VarD"
End If
frm.Variable5 = "VarE"

或者你可以像这样创建一个正确类型的变量:

Dim frm As System.Windows.Forms.Form
If x=y Then
    Dim f As New frm1
    f.Variable1 = "VarA"
    f.Variable2 = "VarB"
    frm = f
Else
    Dim f As New frm2
    f.Variable3 = "VarC"
    f.Variable4 = "VarD"
    frm = f
End If
frm.Variable5 = "VarE"