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

VB.Net Access Variables in a Generic Form Object

我的公司安排我执行一个紧急项目,将我们现有的一个程序从 VB6 更新到 VB.Net。这分两个阶段发生,我个人认为第一个阶段是浪费时间,但坚持要完成,是在 Visual Studio 内使用转换过程,然后清理错误以获得编译版本。该程序的大小很大,但由于我此时没有发言权,所以我正在尝试解决数百个编译器错误。我确实意识到我正在做的不是最佳实践,而且 situation/waste 的时间相当令人沮丧。

基本上有多种形式,其中一种可以调用任意数量的其他形式,这是由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"

但我还没有找到任何可以在如此大量的条件下简单实施的东西。

很抱歉没有鼓励最佳实践,因为我确实意识到任何解决方案都不是这样,但我正在寻找最快的实施方式,以便我可以继续重写整个程序。

丑陋但最简单的解决方案是将 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"