المندوبين كمعلمات في VB.NET
سؤال
الخلفية الدرامية:أنا استخدم 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
بشكل أساسي، قم بإنشاء المفوض الذي تريده، باستخدام التوقيع الصحيح، وقم بتمرير عنوانه إلى الطريقة.