如何创建返回具有该属性名称的对象'属性的lambda表达式

本文关键字:属性 对象 表达式 lambda 何创建 创建 返回 | 更新日期: 2023-09-27 18:08:46

我完全搞不懂这个。我有一段代码,我需要这样实现:

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

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

现在的问题是,我不能硬编码m.m atata . recordid内添加,因为我在这里得到的是一个字符串,告诉我应该使用的属性,在这种情况下"元数据. 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); 

我该怎么做?

如何创建返回具有该属性名称的对象'属性的lambda表达式

我不确定你到底想要什么作为输出(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的这篇文章,它很好地描述了它是如何工作的…
使用反射从属性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;

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

相关文章: