如何创建返回对象属性的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;
请注意,缺少任何类型的参数和返回值检查,并留给读者作为练习。