2010-04-01 4 views
1

는 C#으로 작성 VB에서 나는 다음과 같은 코드가 있습니다번역 대표의 사용은 물리 라이브러리에서

public delegate void PostSolveDelegate(Contact contact, ref ContactImpulse impulse); 
public PostSolveDelegate PostSolve; 

그리고 그 코드를 사용하는 예 (ContactManager.cs에서)

은 다음과 같습니다

를 는

public virtual void PostSolve(Contact contact, ref ContactImpulse impulse) 
{ 
} 

ContactManager.PostSolve += PostSolve; 

(Test.cs에서) 나는 VB에서 동일한 작업을 수행하고 싶습니다

.

나는이 시도 (그냥하지 선언 대리자를 thandling),하지만 작동하지 않습니다

AddHandler ContactManager.PostSolve, AddressOf PostSolve 

다음 작품을 만 나 대리인에 대해 하나의 핸들러를 가질 수 있습니다 :

ContactManager.PostSolve = new PostSolveDelegate(AddressOf PostSolve) 

VB에서 코드의 첫 번째 부분에서 동일한 작업을 수행 할 수있는 방법이 있습니까?

감사합니다.

+0

제목이 다소 혼란 스럽습니다. 이것은 C#에서 VB로, 다른 방법은 아닙니다. 맞습니까? –

+0

"PostSolve"선언을 보여 주실 수 있습니까? –

+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는 첫 번째 대리인을 호출하지 않습니다.

+0

C#의 대리자에서 + =를 호출하면 어떻게됩니까? 그렇다면 Delegate.Remove (ContactManager.PostSolver, PostSolver)를 호출하여 델리게이트에서 제거하겠습니까? –

+0

예. 예를 들어 대답을 업데이트했습니다. –

1

PostSolveContactManager 클래스의 이벤트로 선언 하시겠습니까? 당신은 다음과 같이 선언 할 필요가 다음 PostSolve 여기 이벤트,하지만 대리자가 아니기 때문에

Public Event PostSolve() 

당신이 AddHandler ContactManager.PostSolve, AddressOf PostSolve 할 수 없습니다.

+0

나는 내 게시물을 편집하여 선언문을 보여주었습니다. 불행히도 별도의 라이브러리이기 때문에 변경할 수는 없습니다. –

+0

그러면 나는 당신이 daddyman의 해결책으로 그것을해야한다고 생각합니다. –