Перевод использования делегата из C # в VB - PullRequest
1 голос
/ 01 апреля 2010

В библиотеке физики, написанной на 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 ]

3 голосов
/ 01 апреля 2010

Делегат может быть многоадресным делегатом.В C # вы можете использовать + = для объединения нескольких делегатов в один многоадресный делегат.Обычно вы видите это как событие, а затем используете AddHandler в VB для добавления нескольких делегатов к событию.

Но если вы сделали что-то вроде этого:

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 голос
/ 01 апреля 2010

Вы объявляете PostSolve как событие в классе ContactManager? Вы должны объявить это следующим образом:

Public Event PostSolve()

Вы не можете сделать это AddHandler ContactManager.PostSolve, AddressOf PostSolve потому что PostSolve здесь не событие, а делегат.

...