문제

뒷이야기:나는 사용하고있다 log4net 내가 작업 중인 프로젝트에 대한 모든 로깅을 처리합니다.하나의 특정 메서드는 여러 가지 상황에서 호출될 수 있습니다. 일부는 로그 메시지를 오류로 보증하고 다른 일부는 로그 메시지를 경고로 보증합니다.

예를 들어, 어떻게 하면

Public Sub CheckDifference(ByVal A As Integer, ByVal B As Integer)
  If (B - A) > 5 Then
    log.ErrorFormat("Difference ({0}) is outside of acceptable range.", (B - A))
  End If
End Sub

다음과 같은 내용을 더 자세히 살펴보겠습니다.

Public Sub CheckDifference(ByVal A As Integer, ByVal B As Integer, "Some delegate info here")
  If (B - A) > 5 Then
    **delegateinfo**.Invoke("Difference ({0}) is outside of acceptable range.", (B - A))
  End If
End Sub

이를 호출하고 log.ErrorFormat 또는 log.WarnFormat을 대리자로 전달할 수 있도록 하시겠습니까?

저는 VS 2008 및 .NET 3.5 SP1과 함께 VB.NET을 사용하고 있습니다.또한 저는 일반적으로 대표자에 대해 상당히 새로운 입장이므로 모호함을 제거하기 위해 이 질문을 다르게 표현해야 한다면 알려주십시오.

편집하다:또한 클래스 생성자의 ErrorFormat 또는 WarnFormat에 대한 대리자를 어떻게 초기화할 수 있습니까?말처럼 쉬울까 myDelegate = log.ErrorFormat?나는 그것보다 더 많은 것이 있다고 생각합니다(주제에 대한 나의 무지를 용서하십시오. 대리인은 실제로 내가 더 배우고 싶은 것이지만 지금까지는 내가 이해하지 못했습니다).

도움이 되었습니까?

해결책

대리인 서명을 선언하십시오.

Public Delegate Sub Format(ByVal value As String)

테스트 기능을 정의합니다.

Public Sub CheckDifference(ByVal A As Integer, _
                           ByVal B As Integer, _
                           ByVal format As Format)
    If (B - A) > 5 Then
        format.Invoke(String.Format( _
        "Difference ({0}) is outside of acceptable range.", (B - A)))
    End If
End Sub

코드 어딘가에서 Test 함수를 호출하세요.

CheckDifference(Foo, Bar, AddressOf log.WriteWarn)

또는

CheckDifference(Foo, Bar, AddressOf log.WriteError)

다른 팁

먼저 클래스/모듈 수준에서 대리자를 선언해야 합니다(이 코드는 모두 메모리에서 가져온 것이며 테스트되지 않았습니다).

Private Delegate Sub LogErrorDelegate(txt as string, byval paramarray fields() as string)

그 다음에 ..예를 들어 클래스의 속성으로 선언하고 싶을 것입니다.

Private _LogError
Public Property LogError as LogErrorDelegate
  Get 
    Return _LogError
  End Get
  Set(value as LogErrorDelegate)
    _LogError = value
  End Set
End Property

대리자를 인스턴스화하는 방법은 다음과 같습니다.

Dim led as New LogErrorDelegate(AddressOf log.ErrorFormat)
Public Delegate errorCall(ByVal error As String, Params objs As Objects())
CheckDifference(10, 0, AddressOf log.ErrorFormat)

형식적인 점 양해 부탁드립니다 :P

하지만 기본적으로 올바른 서명을 사용하여 원하는 대리자를 만들고 그 주소를 메서드에 전달합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top