Вы можете использовать
- Отражение для получения свойства
Product.name
из строки name
и
- класс LINQ
Expression
для ручного создания лямбда-выражения.
Обратите внимание, что следующий пример кода будет работать только для операций Equals (==)
. Однако его легко обобщить и на другие операции (разбить на пробел, проанализировать оператор и выбрать соответствующее выражение вместо Expression.Equal
).
var condition = "name == Jujyfruits";
// Parse the condition
var c = condition.Split(new string[] { "==" }, StringSplitOptions.None);
var propertyName = c[0].Trim();
var value = c[1].Trim();
// Create the lambda
var arg = Expression.Parameter(typeof(Product), "p");
var property = typeof(Product).GetProperty(propertyName);
var comparison = Expression.Equal(
Expression.MakeMemberAccess(arg, property),
Expression.Constant(value));
var lambda = Expression.Lambda<Func<Product, bool>>(comparison, arg).Compile();
// Test
var prod1 = new Product() { name = "Test" };
var prod2 = new Product() { name = "Jujyfruits" };
Console.WriteLine(lambda(prod1)); // outputs False
Console.WriteLine(lambda(prod2)); // outputs True
О конструкторе: поскольку Func<T, TResult>
запечатан, вы не можете извлечь из него. Однако вы можете создать оператор неявного преобразования , который переводит Specification<T>
в Func<T, bool>
.