我正在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”。请帮助别人。
答案 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);
}