1

コーディングの慣行を整理しようとしていますが、解決できない問題に遭遇しました。

オプション strict をオンにすると、どのようにフォームのインスタンスを見つけて、そのインスタンスで public サブルーチンを実行するのでしょうか?

たとえば、在庫パッケージでは、パーツをチェックアウトするためのショートカットがあり、チェックアウト フォームが開いているかどうかを確認し、Checkout.AddID(ID as Integer) を実行します。例えば:

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

これは、オプション strict off で問題なく動作します。ただし、オンにして、次のように変更します。

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と、for ループが通常のフォームにヒットするたびに、'Cannot cast type form to FRMcheckout' がスローされます。

オプションstrictをオフにせずにこれを達成する方法は何でしょうか?

4

2 に答える 2

3

OfType enumerable extensionを探します。コードは次のとおりです。

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

これで、ループは FRMCheckout 型のフォームのみを返し、反復子変数は既に厳密に型指定されているため、変換せずにそのパブリック メソッドとプロパティを呼び出すことができます。もちろん、すべての単調な作業は OfType 拡張機能内で行われるため、実際にパフォーマンスの向上が期待されたとしても実際には改善されませんが、コードの一部を記述して理解するためのより明確な方法にすぎません

于 2016-07-09T09:21:15.633 に答える
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

これは機能します。

于 2016-07-09T09:16:26.470 に答える