在用C#编写的物理库中,我有以下代码:
(在ContactManager.cs中)
public delegate void PostSolveDelegate(Contact contact, ref ContactImpulse impulse);
public PostSolveDelegate PostSolve;
使用该代码的示例是:
(在Test.cs中)
public virtual void PostSolve(Contact contact, ref ContactImpulse impulse)
{
}
ContactManager.PostSolve += PostSolve;
我想在VB中做同样的事情。 (只是代表代表,而不是声明)
我试过这个,但它不起作用:
AddHandler ContactManager.PostSolve, AddressOf PostSolve
以下工作,但只允许我为委托提供一个处理程序:
ContactManager.PostSolve = new PostSolveDelegate(AddressOf PostSolve)
我有没有办法在VB中用第一段代码完成同样的事情?
谢谢!
答案 0 :(得分:3)
委托可以是多播委托。在C#中,您可以使用+ =将多个委托合并为一个多播委托。通常你会把这看作是一个事件,然后在VB中使用AddHandler来为事件添加多个委托。
但如果你做了这样的事情:
Public Delegate Sub PostSolver()
然后在类中声明该字段:
Private PostSolve As PostSolver
然后创建了两个委托并使用Delegate.Combine来组合它们:
Dim call1 As PostSolver
Dim call2 As PostSolver
call1 = AddressOf PostSolve2
call2 = AddressOf PostSolve3
PostSolve = PostSolver.Combine(call1, call2)
您可以调用PostSolve()并调用两个代理。
可能更容易让它成为一个事件,设置这样做没有额外的麻烦。
更新:要从列表中删除委托,请使用Delegate.Remove方法。但是您必须小心使用返回值作为新的多播委托,否则它仍然会调用您认为已删除的委托。
PostSolve = PostSolver.Remove(PostSolve, call1)
调用PostSolve不会调用第一个代理。
答案 1 :(得分:1)
您是否将PostSolve
声明为ContactManager
班级的活动?
您需要按如下方式声明:
Public Event PostSolve()
你不能这样做AddHandler ContactManager.PostSolve, AddressOf PostSolve
因为PostSolve
不是此处的事件,而是代表。