0

私はreflector.InvokeMethodを使用して、オプションのパラメーターを使用して関数を呼び出そうとしています。関数は次のようになります。

Private Function DoSomeStuff(ByVal blah1 as string, ByVal blah2 as string, Optional ByVal blah3 as string = "45") as boolean
'stuff
end function

そして私はこのようにそれを呼び出しています:

Dim result As Boolean = Reflector.InvokeMethod(AccessModifier.private,obj_of_Class, "DoSomeStuff", Param1, Param2, Param3)

これは正常に機能しますが、3番目の(オプションの)パラメーターを渡さない場合を除いて、関数にヒットしません。

Dim result As Boolean = Reflector.InvokeMethod(AccessModifier.private,obj_of_Class, "DoSomeStuff", Param1, Param2)

Reflector.invokeMethodを使用して、オプションのパラメーターを渡さずにこの関数を呼び出す方法はありますか?またはこれを達成する別の方法?

4

2 に答える 2

2

Visual Basic コンパイラは、オプションのパラメータ値を呼び出し元のコードに実際に置き換えます。したがって、実際のコードが次の場合:

DoSomeStuff(blah1, blah2)

Visual Basic は、次のような IL コードを出力します。

DoSomeStuff(blah1, blah2, "45")

最後のパラメーターが何であるかを知るには、パラメーターのオブジェクトへの参照を取得する必要があります (Reflector にあるものはわかりません。.NET では、MethodInfo にアクセスしてから ParameterInfo にアクセスします)。次に、そのカスタム属性を取得し、OptionalAttribute と DefaultParameterValueAttribute でマークされた属性を探します。次に、DefaultParameterValueAttribute から値を指定して、3 番目のパラメーターを指定して呼び出す必要があります。

于 2008-11-25T23:06:13.373 に答える
0

オプションのパラメーターを使用するのではなく、 DoSomeStuffメソッドをオーバーロードします...

Private Overloads Function DoSomeStuff(ByVal blah1 As String, ByVal blah2 As String) As Boolean
    Return DoSomeStuff(blah1, blah2, "45")
End Function

Private Overloads Function DoSomeStuff(ByVal blah1 As String, ByVal blah2 As String, ByVal blah3 As String) As Boolean
    'stuff
End Function
于 2008-11-25T22:57:33.643 に答える