早期与泛型绑定 [英] Early Binding with Generics

查看:114
本文介绍了早期与泛型绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 '我有一个接受方法地址和参数的类,并在稍后告诉它时执行它。需要将选项严格关闭,因为Execute方法执行的是后期绑定代码
Option Strict Off

Public Class WorkItem
Private Action As Object
Private Args()As Object

Public Overloads Sub [Set](action As Action)
SetArgs(action)
End Sub

Public Overloads Sub [Set](Of T)(action As Action(Of T),arg As T)
SetArgs(action,arg)
End Sub

Public Overloads Sub [Set](Of T1,T2 )(action As Action(Of T1,T2),arg1 As T1,arg2 As T2)
SetArgs(action,arg1,arg2)
End Sub

'***更多重载的[Set]方法去这里...

Private Sub SetArgs(ByVal action As Object,ParamArray args()As Object)
Me.Action = action
Me .Args = args
结束Sub

Public Sub E xecute()
' - 早期绑定不起作用
'DirectCast(Me.Action,Action(Of T))。Invoke(Args(0))

' - 这有效,但迫使我保持​​选项严格关闭
选择案例Args.Length
案例0:Me.Action.Invoke()
案例1:Me.Action.Invoke(参数(0))
案例2:Me.Action.Invoke(Args(0),Args(1))
案例3:Me.Action.Invoke(Args(0),Args(1) ,Args(2))
案例4:Me.Action.Invoke(Args(0),Args(1),Args(2),Args(3))
End Select
End Sub
End Class

以下是一些测试代码:

  Public Class Form1 
Dim TheTask As WorkItem

Private Sub Button1_Click(sender As Object,e As EventArgs)处理Button1。点击
TheTask = New WorkItem
TheTask.Set(AddressOf DummyProc,TextBox1)
End Sub

Private Sub Button2_Click(sender作为Object,e作为EventArgs)处理Button2.Click
TheTask.Execute()
End Sub

Private Sub DummyProc(arg As TextBox)
Threading.Thread。 Sleep(1000)
Debug.Print(work completed)
End Sub
End Class



WorkItem 类显然不适用于 OPTION STRICT ON ,这是由于在 Execute 方法中的后期调用。



有什么办法可以将迟到的呼叫转换为早期绑定?

解决方案

这可以通过使用代表。您可以声明代表非通用子例程的委托,并在传递 arg 的对象上作为构造函数参数调用该委托的表示形式。我不知道您的解决方案是否仍然需要通用工作项目,但是我的示例仍然保持相同的设置:

  Delegate Sub WorkItem()

Dim TheTask As WorkItem

Private Sub Button1_Click(sender As System.Object,e As System.EventArgs)Handles Button1.Click
TheTask = AddressOf(New DummyProc(Of TextBox)(TextBox1))。执行
End Sub

Private Sub Button2_Click(sender As System.Object,e As System.EventArgs)Handles Button2 .Click
TheTask.Invoke()
End Sub

Private Class DummyProc(Of T)

Private ReadOnly _arg As T

Public Sub New(ByVal arg As T)
_arg = arg
End Sub
$ b $ Public Sub Execute()
MessageBox.Show(String.Format( My Arg:{0},_arg))
Threading.Thread.Sleep(1000)
MessageBox.Show(work completed)
End Sub

End Class


I have a class which takes the method address and arguments, and executes it later when told to do so.

' need to turn option strict off due to Execute method executing late-bound code
Option Strict Off

Public Class WorkItem
    Private Action As Object
    Private Args() As Object

    Public Overloads Sub [Set](action As Action)
        SetArgs(action)
    End Sub

    Public Overloads Sub [Set](Of T)(action As Action(Of T), arg As T)
        SetArgs(action, arg)
    End Sub

    Public Overloads Sub [Set](Of T1, T2)(action As Action(Of T1, T2), arg1 As T1, arg2 As T2)
        SetArgs(action, arg1, arg2)
    End Sub

    '*** more overloads of [Set] method go here... 

    Private Sub SetArgs(ByVal action As Object, ParamArray args() As Object)
        Me.Action = action
        Me.Args = args
    End Sub

    Public Sub Execute()
        '-- early binding doesn't work
        'DirectCast(Me.Action, Action(Of T)).Invoke(Args(0))  

        '-- this works, but forces me to to keep option strict off
        Select Case Args.Length
            Case 0 : Me.Action.Invoke()
            Case 1 : Me.Action.Invoke(Args(0))
            Case 2 : Me.Action.Invoke(Args(0), Args(1))
            Case 3 : Me.Action.Invoke(Args(0), Args(1), Args(2))
            Case 4 : Me.Action.Invoke(Args(0), Args(1), Args(2), Args(3))
        End Select
    End Sub
End Class

Here is some tester code:

Public Class Form1
    Dim TheTask As WorkItem

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TheTask = New WorkItem
        TheTask.Set(AddressOf DummyProc, TextBox1)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        TheTask.Execute()
    End Sub

    Private Sub DummyProc(arg As TextBox)
        Threading.Thread.Sleep(1000)
        Debug.Print("work completed")
    End Sub
End Class

The WorkItem class obviously doesn't work with OPTION STRICT ON, due to the late-bound call in Execute method.

Is there any way I can convert the late-bound call to early binding?

解决方案

This can be achieved by using delegates. You can declare a delegate that represents a non-generic subroutine, and invoke a representation of that delegate on an object that passed arg as a constructor parameter. I don't know if your solution still needs a generic work item by implementing it like this, but my example still keeps that same setup:

Delegate Sub WorkItem()

Dim TheTask As WorkItem

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    TheTask = AddressOf (New DummyProc(Of TextBox)(TextBox1)).Execute
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    TheTask.Invoke()
End Sub

Private Class DummyProc(Of T)

    Private ReadOnly _arg As T

    Public Sub New(ByVal arg As T)
        _arg = arg
    End Sub

    Public Sub Execute()
        MessageBox.Show(String.Format("My Arg: {0}", _arg))
        Threading.Thread.Sleep(1000)
        MessageBox.Show("work completed")
    End Sub

End Class

这篇关于早期与泛型绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆