如何创建一个返回对象的属性,有此属性的名称lambda表达式?(How to create lamb

2019-08-22 08:30发布

我完全失去了在这一个。 我有一段代码,做我需要的时候像这样实现的:

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); 

我怎么做?

Answer 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表达式



Answer 2:

这个怎么样调用:

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?