Vb.net 将委托作为对象属性传递

Vb.net 将委托作为对象属性传递,vb.net,Vb.net,使用.net 3.5,我有一个工作表单,其中我通过构造函数传递一个委托,如下所示: 公共委托子runDelegateByVal pId作为字符串 作为runDelegate的私有delgate Public Sub NewByVal dlg作为runDelegate,ByVal pbtcoption作为String ' ... 如果dlg不是什么,那么 cbtRunOnSelected.Text=pbtcoption cbtrunnselected.Visible=True 如果结束 delga

使用.net 3.5,我有一个工作表单,其中我通过构造函数传递一个委托,如下所示:

公共委托子runDelegateByVal pId作为字符串 作为runDelegate的私有delgate Public Sub NewByVal dlg作为runDelegate,ByVal pbtcoption作为String ' ... 如果dlg不是什么,那么 cbtRunOnSelected.Text=pbtcoption cbtrunnselected.Visible=True 如果结束 delgate=dlg 端接头 私有子CBTRUNSELECTED_ClickByVal发送方作为System.Object,ByVal e作为System.EventArgs处理CBTRUNSELECTED。单击 delgate.InvokeDirectCastbs.Current,DataRowViewid.ToString'调用有效 端接头 但是,我不想传递多个参数,而是想将所有参数组合成一个,如果我想在将来添加它们,object会更灵活,因此我更改了代码:

公共类cDelegate 公共委托子runDelegateByVal pId作为字符串 公共标题作为字符串 末级 作为cDelegate的私有delgate 公共子新ByVal dlg作为cDelegate ' ... 如果dlg不是什么,那么 cbtRunOnSelected.Text=dlg.btCaption cbtrunnselected.Visible=True 如果结束 delgate=dlg 端接头 但问题是,代码不起作用:

私有子CBTRUNSELECTED_ClickByVal发送方作为System.Object,ByVal e作为System.EventArgs处理CBTRUNSELECTED。单击 delgate.runDelegate.InvokeDirectCastbs.Current,DataRowViewid.ToString “这里有错误 端接头 通过实例访问共享成员、常量成员、枚举成员或嵌套类型;将不计算限定表达式


我希望这有帮助。我举了一个小例子来说明你遗漏了什么。具体来说,这是一个您将实际执行的方法

委托是一种方法设计

委托实例是一个方法指针

您需要一个委托实例,这是您所缺少的。这个例子应该可以帮助您看到这一点

公共类类名 公共委托子DelegateNamepId作为字符串 作为新DelegateNameAddressOf方法的公共DelegateInstance 私有子方法PID作为字符串 MessageBox.ShowpId 端接头 末级 作为类名的私有实例 作为类名的公共子NewclassInstance 实例=classInstance 端接头 私有子CBtrunNonSelected\u Clicksender作为对象,e作为事件args处理按钮1。单击 instance.DelegateInstance.Invokestring 端接头
我更改了名称,因为您将所有内容命名为delegate,这很混乱。

对于我来说,DelegateInstance不起作用,我需要在代码之外运行:Dim wF As New myForm New myForm.cDelegate With{.btCaption=Press,…}@mrapi,但实际的委托实例在哪里设置?在我的示例中,实例在构造时被设置为run方法。你到底是怎么处理那根绳子的?那个方法在哪里?@mrapi它可能在你的代码中。i、 e.使用{.btCaption=Press、.myDel=New rundelegateAddress of someMethodWhichTakesString}将wF设置为新的myFormNew myForm.cDelegate。当然,您需要创建实例myDel,这将相当于我的答案中的DelegateInstance。@mrapi上面的代码可以工作。您需要通过更改一些名称使其在您的环境中工作。你试过了吗?嗨。它对我的情况有效,但不适用:“AddressOf method”,我需要更改“method”,它可以使用不同的名称,但对上面的示例无效。最后,我放弃并返回到我的旧工作代码