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

标签 c# .net linq lambda

我完全迷失了这一点。我有一段代码可以在像这样实现时满足我的需要:

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/

相关文章:

c# - 在 Selenium WebDriver 中启动 Chrome Headless 仍然会导致浏览器窗口空白

c# - C#中将String XML转成数据表

.net - 适用于 .NET 完整框架的 SDK 样式 .csproj

c# - LINQ 查询中两个日期之间的日期范围

c# - 序列在 linq 中不包含任何元素异常,甚至不使用 Single

c# - 强制对数组进行垃圾回收,C#

c# - 从 string[] 构建一个字符串而不使用任何循环

c# - 如果我发送函数,则更改字典

c# - WinForm 窗体的新实例

c# - 使用 LINQ 从列表中选择项目,其中子项包含另一个列表中的项目