如何创建返回具有该属性名称的对象'属性的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);
我该怎么做?
我不确定你到底想要什么作为输出(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
这个调用呢:
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;
请注意,没有任何类型的参数和返回值检查,留给读者作为练习。