【问题标题】:using Reflector.Invoke Method on functions wih optional parameters对带有可选参数的函数使用 Reflection.Invoke 方法
【发布时间】:2008-10-31 00:40:55
【问题描述】:

我正在尝试使用 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)

这很好用,除了当我不传递第三个(可选)参数时,它不会命中函数。

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

有没有一种方法可以在不传递可选参数的情况下使用 Reflector.invokeMethod 来调用此函数?或其他方式来实现这一点?

【问题讨论】:

    标签: vb.net reflector


    【解决方案1】:

    Visual Basic 编译器实际上将可选参数值替换为调用代码。因此,如果您的实际代码是:

    DoSomeStuff(blah1, blah2)

    Visual Basic 会发出相当于以下内容的 IL 代码:

    DoSomeStuff(blah1, blah2, "45")

    要知道最后一个参数是什么,您需要获取对参数对象的引用(我不确定 Reflector 中是什么 - 在 .NET 中,您可以访问 MethodInfo,然后访问ParameterInfo),然后获取它的自定义属性,寻找带有 OptionalAttribute 和 DefaultParameterValueAttribute 标记的属性。然后,您需要使用第三个参数调用它,提供来自 DefaultParameterValueAttribute 的值。

    【讨论】:

      【解决方案2】:

      我会重载 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
      

      【讨论】:

        猜你喜欢
        • 2013-08-11
        • 2011-11-17
        • 2019-02-06
        • 2017-09-02
        • 2013-07-03
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多