如何创建返回对象属性的lambda表达式,具有此属性的名称?

我完全迷失在这一个。 我有一段代码可以像我这样实现我需要的东西:

return filters.Add(m => m.Metadata.RecordId).IsEqualTo(1); 

其中m是TestObj类对象, Add方法的参数是Expression<Func>

现在问题是我无法在Add中硬编码m.Metadata.RecordId,因为我在这里得到的是一个字符串,告诉我应该使用的属性,在本例中为“Metadata.RecordId”。 我需要做的是用这个字符串构造这样一个表达式,它将与m => m.Metadata.RecordId做同样的事情。 我需要这样的东西:

 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); 

我怎么做?

我不确定你想要什么作为输出(bool,int和比较),
但这应该让你走上正轨……

 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> lambdaExpression = Expression.Lambda>(property, parameter as ParameterExpression); Add(lambdaExpression); } static void Add(Expression> paramExp) { TestObj obj = new TestObj { Metadata = new Metadata { RecordId = 1, Name = "test" } }; var id = paramExp.Compile()(obj); } 

你也可以查看Jon的这篇文章,它很好地描述了它是如何工作的……
使用reflection从属性Name获取lambda表达式

这个电话怎么样:

 return filters.Add(m => ReflectionMagic(m, "Metadata.RecordId").IsEqualTo(1); 

该方法将具有此签名:

 public object ReflectionMagic(object source, string property); 

如果这样可行,你可以这样做:

 var propertyTree = property.Split('.'); foreach(var propertyName in propertyTree) { var propInfo = source.GetType().GetProperty(propertyName); var source = propInfo.GetValue(source, null); } return source; 

请注意,缺少任何类型的参数和返回值检查,并留给读者作为练习。