How to create lambda expression that returns object's property, having this property's name?

后端 未结 2 1856
清酒与你
清酒与你 2021-01-22 09:39

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         


        
相关标签:
2条回答
  • 2021-01-22 10:34

    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.

    0 讨论(0)
  • 2021-01-22 10:35

    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

    0 讨论(0)
提交回复
热议问题