将委托使用从C#转换为VB

时间:2010-04-01 02:14:05

标签: c# vb.net events delegates c#-to-vb.net

在用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中用第一段代码完成同样的事情?

谢谢!

2 个答案:

答案 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不是此处的事件,而是代表。