我完全迷失了这一点。我有一段代码可以在像这样实现时满足我的需要:
return filters.Add(m => m.Metadata.RecordId).IsEqualTo(1);
其中 m 是 TestObj
类对象和 Add
方法的参数是 Expression<Func<TestObj,bool?>>
.
现在的问题是我不能在 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<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);
}
您还可以查看 Jon 的这篇文章,它很好地描述了它是如何工作的...
Use reflection to get lambda expression from property Name
关于c# - 如何创建返回对象属性并具有此属性名称的 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973414/