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).IsEqua
What about this call:
return filters.Add(m => ReflectionMagic(m, "Metadata.RecordId").IsEqualTo(1);
The method would have this signature:
public object ReflectionMagic(object source, string property);
If that would work, you could do something like this:
var propertyTree = property.Split('.');
foreach(var propertyName in propertyTree)
{
var propInfo = source.GetType().GetProperty(propertyName);
var source = propInfo.GetValue(source, null);
}
return source;
Be aware that any kind of argument and return value checks are missing and are left as an excercise to the reader.
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