I am completely lost on this one. I have a piece of code that does what I need when implemented like this:
return filters.Add(m => m.Metadata.RecordId).IsEqualTo(1);
where m is a TestObj class object and Add method's argument is Expression<Func<TestObj,bool?>>.
Now the problem is that I cannot hardcode m.Metadata.RecordId inside Add, because what I get here is a string that informs me about the property that should be used, in this case "Metadata.RecordId". what I need to do is to construct such an expression with this string that will do the same thing as m => m.Metadata.RecordId does. I need something like this:
string propertyName = "Metadata.RecordId";
Expression expr = null;//create expression here somehow that will do the same as m => m.Metadata.RecordId
return filters.Add(expr).IsEqualTo(1);
How do I do that?
I'm not sure what exactly you want there as an output (bool, int and comparing),
But this should get you on the right track...
public static void Test(string propertyPath)
{
var props = propertyPath.Split('.');
Expression parameter = Expression.Parameter(typeof(TestObj), "x");
Expression property = parameter;
foreach (var propertyName in props)
property = Expression.Property(property, propertyName);
Expression<Func<TestObj, int>> lambdaExpression =
Expression.Lambda<Func<TestObj, int>>(property, parameter as ParameterExpression);
Add(lambdaExpression);
}
static void Add(Expression<Func<TestObj, int>> paramExp)
{
TestObj obj = new TestObj { Metadata = new Metadata { RecordId = 1, Name = "test" } };
var id = paramExp.Compile()(obj);
}
And you can also check this post of Jon's which nicely describes how that works...
Use reflection to get lambda expression from property Name
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With