C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

文字列と同じ名称のメソッドを実行したい

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■94756 / inTopicNo.1)  文字列と同じ名称のメソッドを実行したい
  
□投稿者/ samourai (1回)-(2020/05/13(Wed) 11:15:32)

分類:[VB.NET/VB2005 以降] 

こんにちは。
今、以下のようなコードを書いています。

Public Class Sample1
    '(途中略)

    Private Sub Execute_Sub(ByVal id As String)
        Select Case id
            Case "Test1"
                Test1()
            Case "Test2"
                Test2()
            Case "Test3"
                Test3()
        End Select
    End Sub

    Private Sub Test1()
       '処理
    End Sub

    Private Sub Test2()
       '処理
    End Sub
    '(以下省略)

End Class


今、Execute_Subメソッドで、Select文を用いて、引数のid文字と同じ名前のメソッドを
呼び出しているのですが、この方法とは別に、文字列と同じ名前のメソッドを実行する方法
(マクロの実行のような方法)があると便利だと思ったのですが、そのような方法は
VB(.net)にはあるでしょうか?
ちなみにVB2013を使っています。

引用返信 編集キー/
■94757 / inTopicNo.2)  Re[1]: 文字列と同じ名称のメソッドを実行したい
□投稿者/ KOZ (117回)-(2020/05/13(Wed) 11:32:45)
No94756 (samourai さん) に返信
> 今、Execute_Subメソッドで、Select文を用いて、引数のid文字と同じ名前のメソッドを
> 呼び出しているのですが、この方法とは別に、文字列と同じ名前のメソッドを実行する方法
> (マクロの実行のような方法)があると便利だと思ったのですが、そのような方法は
> VB(.net)にはあるでしょうか?

CallByName メソッドがあります。

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.interaction.callbyname
引用返信 編集キー/
■94758 / inTopicNo.3)  Re[1]: 文字列と同じ名称のメソッドを実行したい
□投稿者/ 魔界の仮面弁士 (2715回)-(2020/05/13(Wed) 11:46:04)
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

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ