3

私はc#でコンソール電卓を書いて​​います。次のコードが機能する必要があります。

Dictionary<string, Delegate> functions = new Dictionary<string, Delegate>();

private void AddMyFunction (Delegate d, string name)
{
    if (name == null)
    {
        name = d.Method.Name;
    }
    functions.Add (name, d);
}

public void AddFunction (Func<decimal, decimal> f, string name)
{
    AddMyFunction (f, name);
}

public void AddFunction (Func<decimal, decimal, decimal> f, string name)
{
    AddMyFunction (f, name);
}        

public double PerformOperation (string op, decimal x)
{
    return functions [ op ] (x);
}    

関数「PerformOperation」で「メソッド名が必要です」というエラーが出ます。誰か助けてください。

4

2 に答える 2

4

これを次のように変更します。

public decimal PerformOperation (string op, decimal x)
{
    return (decimal)(functions[op].DynamicInvoke(x));
}  

そしてそれはうまくいくでしょう。ただし、もう少し強く型付けされたものをお勧めします。おそらく、次のように、デリゲートの種類ごとに 1 つずつ、複数の辞書を保持します。

Dictionary<string, Func<decimal, decimal>> func1;
Dictionary<string, Func<decimal, decimal, decimal>> func2;

public void AddFunction (Func<decimal, decimal> f, string name)
{
    func1.Add(name, f);
}

public void AddFunction (Func<decimal, decimal, decimal> f, string name)
{
    func2.Add(name, f);
} 

public decimal PerformOperation (string op, decimal x)
{
    return func1[op](x);
}

public decimal PerformOperation (string op, decimal x, decimal y)
{
    return func2[op](x, y);
}
于 2013-08-22T08:35:29.120 に答える