【问题标题】:How do I call a subroutine from a string variable?如何从字符串变量调用子例程?
【发布时间】:2015-07-15 04:00:57
【问题描述】:

使用 VB.Net 4 和 VS2012

我有一个包含一些逻辑的模块,如下所示:

Module Mod1
    If x = 1 then 
       Mod2("Mod3","save_it")
    else
       Mod2("Mod4","edit_it")
    end if
End Module

Module Mod2(which_mod, which_action)
     ' call the correct subroutine
     which_mod.which_action()
End Module

如何使用字符串从不同的模块调用正确的子程序?

【问题讨论】:

  • 有效的语法是什么语言?它肯定不是 VB.NET。你不能给模块体添加逻辑,你必须使用一个方法。
  • 你为什么要这样做?您的基本需求是什么?
  • @Enigmativity 我同意。这看起来确实像 XYProblem
  • 为了简洁和演示问题,语法被缩写。不全面。

标签: vb.net string converter subroutine


【解决方案1】:

查看 System.Reflection 命名空间,它包含一个名为 MethodInfo 的类。

您可以使用方法名称获取给定对象的 MethodInfo,然后调用它:

Dim method As MethodInfo = obj.GetType().GetMethod(methodName, BindingFlags.Instance Or BindingFlags.Public)
method.Invoke()

【讨论】:

    【解决方案2】:

    source

    有一个函数 CallByName 正是这样做的。

    函数接受4个参数:

    • 对象/类

    • 函数/进程名

    • 调用类型(CallType.method、CallType.Get、CallType.Set)

    • (可选):参数(数组格式)

    第一个参数(对象/类)不能是字符串,所以我们必须将字符串转换为对象。最好的方法是

    Dim MyInstance As Object = Activator.CreateInstance(Type.GetType(which_mod))
    

    所以对于你的代码:

    Imports Microsoft.VisualBasic.CallType
    Imports System.Reflection
    Class Mod1
        If x = 1 then 
           Mod2("Mod3","save_it")
        else
           Mod2("Mod4","edit_it")
        end if
    End Class
    
    Module Mod2(which_mod, which_action)
         ' call the correct subroutine
         Dim MyInstance As Object = Activator.CreateInstance(Type.GetType(which_mod))
         CallByName(MyInstance , which_action, CallType.Method)
    End Module
    

    【讨论】:

    • 非常接近。 which_mod 变量是 Object 而不是 String
    • 这就是字符串到对象的字典将发挥作用的地方。需要某种对象查找才能从字符串中工作。
    • @Enigmativity 我使用了System.Reflection 库,@trucket_jim 他的回答中也提到了这个库。
    • 您不能使用反射来获取对象引用 - 您需要对象引用首先才能使用反射。也就是说,除非您使用反射来实际创建实例,否则这看起来更像是依赖注入。
    猜你喜欢
    • 2017-08-08
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    相关资源
    最近更新 更多