我完全失去了在这一个。 我有一段代码,做我需要的时候像这样实现的:
return filters.Add(m => m.Metadata.RecordId).IsEqualTo(1);
其中m是TestObj
类对象和Add
方法的参数是Expression<Func<TestObj,bool?>>
。
现在的问题是,我不能硬编码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);
}
而且你还可以检查这个帖子乔恩的哪很好地描述了如何工作的?
使用反射来获取物业名称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;
要知道,任何类型的参数和返回值检查的失踪,留下作为锻炼; Tibial给读者。
文章来源: How to create lambda expression that returns object's property, having this property's name?