0

我正在尝试创建一个程序,该程序输入来自用户的命令,例如“add 2 4”,然后调用基于该命令的方法。所以我输入命令字符串“add 2 4”,然后解析器读取第一个单词“add”并将其作为例程的名称输出,将该例程名称与参数一起发送到另一个子程序,然后调用相关的子程序.

本质上,我试图避免这种情况:

Select Case RoutineName.ToUpper
    Case "ADD"
        Add(Param1, Param2)
    Case "SUBTRACT"
        Subtract(Param1, Param2)
    Case "MULTIPLY"
        Multiply(Param1, Param2)
    ...

因为我希望能够轻松添加对新 sub 的引用,而无需不断更新 Selection 语句。

我看到其他人遇到同样的问题:在.NET 中基于字符串值创建一个方法调用,但我无法理解他的问题的任何答案,或者它们不在 VB 中。有人建议使用代表字典,以字符串为键。这听起来是个好主意,但代表们让我很困惑:谁能告诉我如何实施这个解决方案?

4

2 回答 2

1

你必须看看反射。在 NET 上搜索也有很多 VB.NET 的例子。我可以建议的策略是让一个类实现函数Add Subtract等,并使用反射 GetMethod() 和 Invoke() 根据命令字符串调用它们。

一个例子可能是:

Type type = calcobject.GetType();
MethodInfo method = type.GetMethod(RoutineName);
if (method != null)
{
    method.Invoke(this, ...parameters...);
}

使用代表字典可能会更好,但它不能满足您对自动绑定的要求:当您决定扩展解释器理解的功能时,您需要手动在字典中添加新功能。您甚至可以自动填写字典;但在这种情况下,反射再次出现。

于 2013-06-13T06:08:14.183 回答
1

如果您想将可变数量的参数传递给函数,我使用了数组。你不必

Dim methods As New Dictionary(Of String, Func(Of Double(), Double))
Dim results as double

methods.Add("Add", Function(values() As Double) values(0) + values(1))
methods.Add("Sub", Function(values() As Double) values(0) - values(1))
methods.Add("Mul", Function(values() As Double) values(0) * values(1))
methods.Add("Div", Function(values() As Double) values(0) / values(1))

results = methods("Add")(New Double() {1, 2})
results = methods("Sub")(New Double() {5, 3})
results = methods("Mul")(New Double() {4, 8})
results = methods("Div")(New Double() {1, 2})

没有数组...

Dim methods As New Dictionary(Of String, Func(Of Double, Double, Double))

methods.Add("Add", Function(a As Double, b As Double)
                       Return a + b
                   End Function)

methods.Add("Sub", Function(a As Double, b As Double)
                       Return a - b
                   End Function)

methods.Add("Mul", Function(a As Double, b As Double)
                       Return a * b
                   End Function)

methods.Add("Div", Function(a As Double, b As Double)
                       Return a / b
                   End Function)

results = methods("Add")(1, 2)
results = methods("Sub")(5, 3)
results = methods("Mul")(4, 8)
results = methods("Div")(1, 2)
于 2013-06-13T20:00:37.693 回答