0

アクションの配列をパラメーターとして受け取るメソッドがあります。この配列内のアクションには常に 1 つのパラメーターが必要ですが、パラメーターの型は異なる場合があります

メソッドは、アクションを呼び出す前に、アクションに必要なパラメーターのタイプを確認する必要があります。が必要な場合String、パラメータは になります"text"。が必要な場合Integer、パラメータは になります123

これは私が試したことです:

Sub MethodA(ParamArray actions() As Action(Of Object))
  For Each action() As Action(Of Object) In actions
    If action.Method.GetParameters()(0).ParameterType = GetType(String) Then
      action("text")
    ElseIf action.Method.GetParameters()(0).ParameterType = GetType(Integer) Then
      action(123)
    ElseIf ...
      ' You get the point.
    End If
  Next
End Sub

ただ、パラメータ配列がしかとらないためか、action.Method.GetParameters()(0).ParameterTypeは常にです。ObjectMethodAAction(Of Object)

コードが機能しないため、他に何を試すことができますか? アクションが実際に必要とするタイプを見つけるにはどうすればよいですか?

: を使用することもできますが、メソッドを呼び出さTry ... Catchに必要なパラメーターの型を特定したいと考えています。

編集: と の動作がAction(Of T)わかりAddressOfません。これはおそらく私の質問に関連しています。次のコードを参照してください。

Sub MyStringMethod(s As String)
  ' Do something
End Sub

MethodA(AddressOf MyStringMethod) ' Compiles
Dim stringAction As Action(Of String) = AddressOf MyStringMethod
MethodA(stringAction) 'Does not compile

ここでの違いは何ですか?AddressOfを生成しAction(Of Object)ますか?

4

1 に答える 1

0

Action(Of Object)問題は、変数をAction(Of String)またはオブジェクトに設定する方法がないことAction(Of Integer)です。たとえば、次のようになります。

Dim actions(2) As Action(Of Object)
'The following lines will not compile
actions(0) = New Action(Of String)(AddressOf MyStringMethod)
actions(0) = New Action(Of Integer)(AddressOf MyIntegerMethod)

したがって、問題はタイプをチェックしている場所ではありません。問題は、そもそも他のタイプをメソッドに渡すことができないということです。それでは、メソッドはどうやって知ることができるのでしょうか。

たとえば、ラッパークラスを作成して、各アクションでタイプを渡す必要があります。

Public Class MyAction
    Public Sub New(ByVal action As Action(Of Object), ByVal parameterType As Type)
        _action = action
        _type = Type
    End Sub

    Public ReadOnly Property Action() As Action(Of Object)
        Get
            Return _action
        End Get
    End Property
    Private _action As Action(Of Object)

    Public ReadOnly Property Type() As Type
        Get
            Return _type
        End Get
    End Property
    Private _type As Type
End Class

または、配列内のすべてのアイテムが同じパラメーターを受け取る場合は、メソッドのパラメーターとしてタイプを要求できます。たとえば、次のようになります。

Sub MethodA(ParamArray actions() As Action(Of Object), parameterType As Type)
    '...
End Sub

アップデート

その後の会話に基づいて、あなたがする必要があるDelegateのは、タイプの代わりに基本タイプを使用することAction(Of Object)です。例えば:

Sub MethodA(ParamArray actions() As [Delegate])
    '...
End Sub

ただし、そうすることで、他のタイプの署名を持つデリゲートを渡すことができるようになります。たとえば、のFunction代わりにSub、またはパラメーターがゼロのメソッド、またはパラメーターが1つではなく多すぎるメソッドが許可されます。したがって、デリゲートの署名が期待どおりであることを確認するために、内部で追加のチェックを行う必要がある場合があります。

于 2012-12-03T12:45:29.160 に答える