委托 - 方法名称预期错误

时间:2013-08-22 08:31:08

标签: c# delegates

我正在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”。请帮助别人。

2 个答案:

答案 0 :(得分:5)

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

Dictionary<string, Func<decimal, double>>

然后该错误消失了 - 但您无法在字典中添加Func<decimal, decimal>作为值,当然......或Func<decimal, decimal, decimal>

如果您不想将自己绑定到特定的委托类型, 可以使用Delegate.DynamicInvoke - 但是您仍然有问题处理您期望double返回值但调用返回decimal的委托的事实。如果您只是将DynamicInvoke的结果转换为double,则会收到取消装箱错误。

还有一个问题,即您尝试调用的代理可能有两个参数,而您只提供一个参数。

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

答案 1 :(得分: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);
}