|
■No94756 (samourai さん) に返信 > 今、Execute_Subメソッドで、Select文を用いて、引数のid文字と同じ名前のメソッドを > 呼び出しているのですが、この方法とは別に、文字列と同じ名前のメソッドを実行する方法 > (マクロの実行のような方法)があると便利だと思ったのですが
========================= =====【案1】CallByName で呼び出せるよう、Test1〜Test3 を Public で公開する
Public Class Sample1 Private Sub Execute_Sub(ByVal id As String) CallByName(Me, id, CallType.Method) End Sub
Public Sub Test1() '処理 End Sub
========================= =====【案2】文字列で呼び出せるよう、Dictionary(Of String, デリゲート) に蓄えておく
Public Class Sample1 '(途中略) Private methods As New Dictionary(Of String, Action) From { {"Test1", AddressOf Test1}, {"Test2", AddressOf Test2}, {"Test3", AddressOf Test3} }
Private Sub Execute_Sub(ByVal id As String) methods(id)() End Sub
Private Sub Test1() '処理 End Sub
========================= =====【案3】Private のまま呼び出すため、リフレクションで無理矢理掘り起こす
Imports System.Reflection Public Class Sample1 Private Shared cache As New Dictionary(Of String, Action) Public Sub Execute_Sub(ByVal id As String) If Not cache.ContainsKey(id) Then Dim m As MethodInfo = [GetType]().GetMethod(id, BindingFlags.Instance Or BindingFlags.NonPublic, Type.DefaultBinder, Type.EmptyTypes, Nothing) If m Is Nothing Then Throw New ArgumentException() Else cache.Add(id, Sub() m.Invoke(Me, Nothing)) End If End If cache(id).Invoke() End Sub
Private Sub Test1() '処理 End Sub
|