you can use
- Reflection to get
Product.name property from name string and - LINQ
Expression class to manually create a lambda expression.
Note that the following code example will only work for Equals (==) operations. However, it is easy to generalize to other operations (divide by spaces, parse the operator and select the appropriate expression instead of 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
About the constructor: since Func<T, TResult> sealed, you cannot extract from it. However, you can create an implicit conversion operator that translates Specification<T> to Func<T, bool> .
Heinzi
source share