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”中出现错误:“Method name expected”。请帮助某人。

4

2 回答 2

5

问题是您试图使用裸Delegate类型,就好像它是特定的委托类型一样。如果您将字典更改为:

Dictionary<string, Func<decimal, double>>

然后那个错误就消失了——但是你不能Func<decimal, decimal>在字典中添加 a 作为值,当然......或者 a Func<decimal, decimal, decimal>

如果您不想将自己绑定到特定的委托类型,则可以使用- 但是您仍然会遇到处理您期望返回值但调用返回的委托的问题。如果您只是将结果转换为to ,您将收到一个拆箱错误。Delegate.DynamicInvokedoubledecimalDynamicInvokedouble

还有一个问题是您尝试调用的委托可能有两个参数,而您只提供一个参数。

基本上,您需要更加一致地了解您希望字典中的值是什么。

于 2013-08-22T08:34:03.173 回答
4

将其更改为:

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

它会起作用。但是,我会推荐一些更强烈的类型。也许保留多个字典,每个代表类型一个,如下所示:

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 回答