在选项Strict ON的表单上运行sub

时间:2016-07-09 09:08:24

标签: .net forms option-strict

快点,我正在尝试清理我的编码习惯,遇到这种情况我无法解决。

如果选项严格,您如何找到表单的实例并在所述实例上运行公共子?

例如,在库存包中,我有一个签出部件的快捷方式,它可以查看是否打开了签出表单并运行Checkout.AddID(ID为整数)。 EG:

For Each Form In Application.OpenForms
    If Form.Name = "FRMCheckout" Then
        Form.AddIDToList(PartID)
    End If
Next

这适用于选项严格关闭。但是,打开它并修改它以适合如下:

For Each Form As Windows.Forms.Form In Application.OpenForms
    ' If Form.Name = "FRMCheckout" Then EDIT: Dropped this in leu of this:
    If TypeOf (Form) Is FRMCheckout Then
        Form.AddIDToList(Ctype(PartID, Integer))
    End If
Next

显然错误地显示.AddIDToList不是Forms.form的成员。

更改为For Each Form as ProgramNamespace.FRMCheckout会抛出'无法将类型表单转换为FRMcheckout'当for循环达到正常形式时。

在不关闭选项严格的情况下,如何实现这一目标?

(请记住我们问,因为我们试图在你投票之前学习这只是因为它对你很明显)

2 个答案:

答案 0 :(得分:3)

查找OfType enumerable extension,代码只是

For Each checkout In Application.OpenForms.OfType(Of FRMCheckout)()
    checkout.AddIDToList(Ctype(PartID, Integer))
Next

现在循环只返回FRMCheckout类型的形式,并且迭代器变量已经强类型化,因此您可以调用其公共方法和属性而无需任何转换。当然,所有繁琐的工作都是在OfType扩展中完成的,所以如果有任何预期的话,它并不是真正的性能改进,而只是一种更清晰的方式来编写和理解一段代码

答案 1 :(得分:2)

所以我发现以下是一个解决方案,在我看来看起来有点整洁:

Option Strict On

For Each Form As Windows.Forms.Form In Application.OpenForms
   If TypeOf (Form) Is FRMCheckout Then
        Dim Checkout_Instance As FRMCheckout = CType(Form, FRMCheckout)
        Checkout_Instance.AddIDToList(PartID.ToString)
   End If
Next

这很有效。