我正在实现一个非常简单的规则引擎,它在运行时动态地强制执行某些规范。
实际规则存储在元组中,我无法将代理存储到string.EndsWith
函数。
以下代码用于测试字符串相等性,并按预期返回False
("A"
与"B"
不同):
var rule = new Tuple<string, Func<string, string, bool>, string>("A", string.Equals, "B");
Console.WriteLine(rule.Item2.Invoke(rule.Item1, rule.Item3));
但是,我无法弄清楚如何调整此代码以使用string.EndsWith
函数而不是string.Equals
。
以下代码无法编译并在Visual Studio中发出Cannot convert from 'method group' to 'Func<string, string, bool>'
错误消息。
var rule = new Tuple<string, Func<string, string, bool>, string>("A", string.EndsWith, "B");
Console.WriteLine(rule.Item2.Invoke(rule.Item1, rule.Item3));
我在询问此问题之前进行了搜索,但我无法理解How do I fix 'compiler error - cannot convert from method group to System.Delegate'?或Cannot convert from method group to System.Func<string>中提供的答案。我不知道如何将这些应用到我的问题中。
答案 0 :(得分:4)
String.Equals和String.EndsWith具有不同的方法签名,必须以不同方式调用。
具体来说,String.Equals是静态的,需要两个字符串并返回一个bool。 String.EndsWith是一个实例方法,它接受一个字符串并返回一个bool
您可以通过在lambda中包装String.EndsWith调用来更改签名以获取两个字符串并返回bool来解决您的问题:
var rule = new Tuple<string, Func<string, string, bool>, string>
("AB", (string a, string b) => a.EndsWith(b), "B");
Console.WriteLine(rule.Item2.Invoke(rule.Item1, rule.Item3));
通常,错误意味着编译器无法将string.EndsWith
解释为Func<string, string, bool>
。您可能会发现此answer about what is a method group helpful来理解错误消息。