How do I build an expression that will fulfill the following goal:
public object Eval(object rootObj, string propertyString)
eg: Eval(person, "Address.ZipCode") => return person.Address.ZipCode
Expression.PropertyOrField doesn't work because I don't have the type of each intermediate property. I'd like to avoid creating a dependency on a scripting library.
I want to try to use expressions because it would allow me to store a cache of these expression trees as they would be executed several times. I'm aware that it's possible to do this iteratively or recursively with reflection.
It sounds like you're looking for something like this:
public object Eval(object root, string propertyString)
{
var propertyNames = propertyString.Split('.');
foreach(var prop in propertyNames)
{
var property = root.GetType().GetProperty(prop);
if (property == null)
{
throw new Exception(...);
}
root = property.GetValue(root, null);
}
return root;
}
To create an Expression
use this:
public Expression Eval(object root, string propertyString)
{
var propertyNames = propertyString.Split('.');
ParameterExpression param = Expression.Parameter(root.GetType, "_");
Expression property = param;
foreach(var prop in propertyName)
{
property = Expression.PropertyOrField(property, prop);
}
return Expression.Lambda(property, param);
}
Here's a recursive version of p.s.w.g's code, working with Expressions
.
public Expression Eval(Expression expression, string property)
{
var split = property.Split('.');
if (split.Length == 1)
{
return Expression.PropertyOrField(expression, property);
}
else
{
return Eval(Expression.PropertyOrField(expression, split[0]), property.Replace(split[0] + ".", ""));
}
}
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