من الممكن مثيل واستدعاء مندوب بالاسم؟
سؤال
وأنا في محاولة لمعرفة ما اذا كان من الممكن مثيل واستدعاء مندوب بالاسم، وليس صراحة. أعتقد رمز يوضح بلوس جيدا إلى حد ما .... أريد أن قبول اسم الدالة، ومن ثم مثيل مندوب بناء على ذلك. في المثال يمكنني استخدام حالة مختارة، ولكن أريد أن القضاء على ذلك ومجرد استخدام الوسيطة METHODNAME نفسها.
والاحترام ... يرجى تجنب الرغبة في أن تقول لي هذا هو مجنون وأرجو أن أخذ بعض نهجا مختلفا تماما لهذا. :)
Private Delegate Sub myDelegate()
Private Sub myDelegate_Implementation1()
'Some code
End Sub
Private Sub myDelegate_Implementation2()
'Some code
End Sub
Public Sub InvokeMethod(ByVal methodName As String)
Dim func As myDelegate = Nothing
'??? HOW TO GET RID OF THIS SELECT CASE BLOCK?:
Select Case methodName
Case "myDelegate_Implementation1"
func = AddressOf myDelegate_Implementation1
Case "myDelegate_Implementation2"
func = AddressOf myDelegate_Implementation2
End Select
func.Invoke()
End Sub
وبفضل كيث، بالضبط ما كنت أبحث عنه. (نهج BFree من شأنه أن تعمل بشكل جيد في معظم الحالات على الرغم من).
وهنا هو رمز العمل في VB:
Public Delegate Sub xxxDelegate()
Sub xxxAnImplementation()
End Sub
Sub zzzDoIt(ByVal xxxImplementerName As String)
Dim theDelegate As xxxDelegate = CType(System.Delegate.CreateDelegate(GetType(xxxDelegate), Me, xxxImplementerName), xxxDelegate)
theDelegate.Invoke()
End Sub
Private Sub LoadFunctions()
Dim thisClass As Type = Type.GetType(Me.GetType.BaseType.FullName.ToString)
For Each method As MethodInfo In thisClass.GetMethods(System.Reflection.BindingFlags.DeclaredOnly)
If 1 = 1 OrElse method.Name.Substring(0, 3) = "Get" Then
Me.ddlCodeSamples.Items.Add(method.Name)
End If
Next
End Sub
المحلول
إذا كان لديك مندوب عن الطريقة التي يمكن أيضا القيام بذلك:
public delegate void MethodDelegate( ... ) ...
//create the delegate we expect
(MethodDelegate) Delegate.CreateDelegate(
typeof( MethodDelegate ), this, "methodName", true );
وC #، وأنا أعلم، ولكن على غرار ستعمل في VB.
وعادة كنت اذهب مع @ BFree في الجواب، ولكن هذا يعمل بشكل جيد عند العمل مع الحدث يحركها التفكير - وأعتقد أن هذا سوف يكون أسرع قليلا إذا استدعاء الكثير نتيجة مندوب مرات
نصائح أخرى
ولن أجيب تماما السؤال، لأنني لست متأكدا إذا ما كنت طالبا غير ممكن. ما هو ممكن على الرغم، من خلال التأمل، هو استدعاء الأسلوب نظرا للاسم الأسلوب. IE:
string methodName = "MyMethod";
MethodInfo method = this.GetType().GetMethod(methodName);
method.Invoke(this, null);
لماذا لا تستخدم جدول هاش بدلا من العبارة تحديد؟
BFree في الإجابة أعمال ؛
وجوابي هو مجرد اقتراح؛
لماذا لا مجرد تمرير عنوان طريقة لInvokeMethod بدلا من تمرير اسم الأسلوب في سلسلة؟
Module Module1
Sub Main()
InvokeMethod(AddressOf myDelegate_Implementation1)
InvokeMethod(AddressOf myDelegate_Implementation2)
End Sub
Public Delegate Sub myDelegate()
Private Sub myDelegate_Implementation1()
Console.WriteLine("myDelegate_Implementation1")
End Sub
Private Sub myDelegate_Implementation2()
Console.WriteLine("myDelegate_Implementation2")
End Sub
Public Sub InvokeMethod(ByVal func As myDelegate)
func()
End Sub
End Module