早期与泛型绑定 [英] Early Binding with Generics
问题描述
'我有一个接受方法地址和参数的类,并在稍后告诉它时执行它。需要将选项严格关闭,因为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屋!