将包含特定标识符的数组解析为表达式
Parse as expression an array containing specific identifier
我正在使用 ParseAsExpression
从字符串表达式构建动态 lamda 表达式。问题是我无法弄清楚如何解析包含 mylist.Contains(x.Id)
这样的对象的数组表达式
完整示例
var list = new int[] { 4,5,6};
var whereFunction = new Interpreter().SetVariable("mylist", list);
whereFunction.ParseAsExpression<Func<Person, bool>>("(person.Age == 5 && person.Name.StartsWith(\"G\")) || person.Age == 3 && mylist.Contains(person.Id)", "person");
我可以确认这是一个错误:https://github.com/davideicardi/DynamicExpresso/issues/68
现在 Array.Contains
不起作用。
更新:
已在版本 2.0.2 中修复。
现在您可以通过为每个方法实现别名扩展方法来解决问题,例如 Contains
=>Exists
:
var list = new int[] { 4,5,6};
var whereFunction = new Interpreter()
.SetVariable("mylist", list)
.Reference(typeof(ExtensionMethods));
whereFunction.ParseAsExpression<Func<Person, bool>>("(person.Age == 5 && person.Name.StartsWith(\"G\")) || person.Age == 3 && mylist.Exists(person.Id)", "person");
// Define this class somewhere
public static class ExtensionMethods
{
public static bool Exists<T>(this IEnumerable arr, T searchKey)
{
return ((IEnumerable<T>)arr).Contains(searchKey);
}
}
我认为这是一个愚蠢的解决方法,但它会起作用。
我正在使用 ParseAsExpression
从字符串表达式构建动态 lamda 表达式。问题是我无法弄清楚如何解析包含 mylist.Contains(x.Id)
完整示例
var list = new int[] { 4,5,6};
var whereFunction = new Interpreter().SetVariable("mylist", list);
whereFunction.ParseAsExpression<Func<Person, bool>>("(person.Age == 5 && person.Name.StartsWith(\"G\")) || person.Age == 3 && mylist.Contains(person.Id)", "person");
我可以确认这是一个错误:https://github.com/davideicardi/DynamicExpresso/issues/68
现在 Array.Contains
不起作用。
更新:
已在版本 2.0.2 中修复。
现在您可以通过为每个方法实现别名扩展方法来解决问题,例如 Contains
=>Exists
:
var list = new int[] { 4,5,6};
var whereFunction = new Interpreter()
.SetVariable("mylist", list)
.Reference(typeof(ExtensionMethods));
whereFunction.ParseAsExpression<Func<Person, bool>>("(person.Age == 5 && person.Name.StartsWith(\"G\")) || person.Age == 3 && mylist.Exists(person.Id)", "person");
// Define this class somewhere
public static class ExtensionMethods
{
public static bool Exists<T>(this IEnumerable arr, T searchKey)
{
return ((IEnumerable<T>)arr).Contains(searchKey);
}
}
我认为这是一个愚蠢的解决方法,但它会起作用。