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)
    ...

Selection ステートメントを継続的に更新しなくても、新しいサブルーチンへの参照を簡単に追加できるようにしたいからです。

他の誰かが同じ問題を抱えているのを見ました:文字列値に基づいて .NET でメソッド呼び出しを作成しますが、彼の質問に対する答えが理解できなかったか、VB にありませんでした。ある人は、文字列をキーとしてデリゲートの辞書を使用することを提案しました。これは素晴らしいアイデアのように聞こえますが、代表団は私を大いに混乱させます.このソリューションがどのように実装されるかを誰かに教えてもらえますか?

4

2 に答える 2

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 に答える
1

Reflectionを見る必要があります。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 に答える