سؤال

الخلفية الدرامية:أنا استخدم 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 كمفوض؟

أنا أستخدم VB.NET مع VS 2008 و.NET 3.5 SP1.كما أنني جديد إلى حد ما على المندوبين بشكل عام، لذا إذا كان من الضروري صياغة هذا السؤال بشكل مختلف لإزالة أي غموض، فأخبرني بذلك.

يحرر:وأيضًا، كيف يمكنني تهيئة المفوض إما إلى 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

في مكان ما في الكود الخاص بك، قم باستدعاء وظيفة الاختبار الخاصة بك:

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