DynamicExpresso.SetFunction不适用于方法重载

时间:2018-06-21 11:53:50

标签: c# expression-evaluation dynamic-expresso

我正在使用Dynamic Expresso进行表情评估,并且就像一个护身符。实际上是在设置自定义函数,但方法重载似乎出了点问题。

我实际上有两种Round方法:

第一个带有一个参数的

public static decimal Round(decimal userNumber)
{
    return Math.Round(userNumber);
}

第二个带有两个参数:

public static decimal Round(decimal userNumber, int decimals)
{
    return Math.Round(userNumber, decimals);
}

声明了代表,并且Interpreter.SetFunction的调用也没有错误:

Func<decimal, decimal> roundFunction1 = (userNumber) => Round(userNumber);
Func<decimal, int, decimal> roundFunction2 = (userNumber, decimals) => Round(userNumber, decimals);

interpreter.SetFunction("ROUND", roundFunction1);
interpreter.SetFunction("ROUND", roundFunction2);

变量已正确传递,并且我已经检查了很多次,我传递的参数实际上是decimal

我通过的求值表达式最终包含以下字符串,由于Interpreter.SetVariable(property.Key, property.Value)插入了"ImporteTotal"666.66,因此该字符串没有错:

ROUND(ImporteTotal)

因此,评估完成后出现的异常是:

  

参数列表与委托表达式(索引0)不兼容。

请注意,我实际上是在设置很多功能,这些功能甚至使用DateTimeintstring等,甚至是组合的重载功能!它们全部工作正常,但是似乎删除所有这些重载都可以使其正常工作。如果它们都在Dynamic Expresso上“导入”,它会抱怨。

有什么想法吗?

非常感谢。

UPDATE-EDIT:

我查看了UnitTesting Davide provided through pastebin,看来我失败了。

这个单元测试似乎失败了。

[Test]
public static void TestInterpreter()
{
    var interpreter = new Interpreter();

    Func<decimal, decimal> roundFunction1 = (userNumber) => Round(userNumber);
    Func<decimal, int, decimal> roundFunction2 = (userNumber, decimals) => Round(userNumber, decimals);
    Func<string, string, int> charindexFunction1 = (toFind, userString) => Charindex(toFind, userString);
    Func<string, string, int, int> charindexFunction2 = (toFind, userString, offset) => Charindex(toFind, userString, offset);

    interpreter.SetFunction("ROUND", roundFunction1);
    interpreter.SetFunction("ROUND", roundFunction2);
    interpreter.SetFunction("CHARINDEX", charindexFunction1);
    interpreter.SetFunction("CHARINDEX", charindexFunction2);

    var importe = 666.66M;
    interpreter.SetVariable("ImporteTotal", importe);

    var textoAlbaran = "ALBARAN-01";
    interpreter.SetVariable("Albaran", textoAlbaran);

    Assert.AreEqual(Round(importe), interpreter.Eval("ROUND(ImporteTotal)"));
    Assert.AreEqual(Round(importe, 1), interpreter.Eval("ROUND(ImporteTotal, 1)"));
    Assert.AreEqual(Charindex("BARAN", textoAlbaran), interpreter.Eval("CHARINDEX(\"BARAN\", Albaran"));
    Assert.AreEqual(Charindex("BARAN", textoAlbaran, 2), interpreter.Eval("CHARINDEX(\"BARAN\", Albaran, 2)"));
}

public static decimal Round(decimal userNumber)
{
    return Math.Round(userNumber);
}

public static decimal Round(decimal userNumber, int decimals)
{
    return Math.Round(userNumber, decimals);
}

public static int Charindex(string toFind, string userString)
{
    return userString.IndexOf(toFind);
}

public static int Charindex(string toFind, string userString, int offset)
{
    return userString.IndexOf(toFind, offset);
}

0 个答案:

没有答案