J. *_*mes 5 c# expression-trees
这是我第一次真正处理表达树,我有点迷失.如果这个问题根本没有任何意义,我道歉.考虑以下类:
public class Foo<T> {
public T Value { get; set; }
public bool Update { get; set;}
}
public class Bar {
public Foo<bool> SomeBool { get; set; }
public Foo<string> SomeString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以现在我有一个如下所示的辅助方法:
public void Helper<T>(Expression<Func<Bar, Foo<T>>> baseExpression, Expression<Func<Bar, T>> valExpression, Expression<Func<Bar, bool>> updateExpression)
{
// Do some stuff with those expressions.
}
Run Code Online (Sandbox Code Playgroud)
然后它被调用如下:
Helper(b=>b.SomeBool,b=>b.SomeBool.Value,b=>b.SomeBool.Update);
Run Code Online (Sandbox Code Playgroud)
但我不喜欢构建三个几乎完全相同的表达式,并且必须明确地将它们传递给Helper.我更喜欢的是这样的事情:
Helper(b=>b.SomeBool);
Run Code Online (Sandbox Code Playgroud)
然后:
public void Helper<T>(Expression<Func<Bar, Foo<T>>> baseExpression)
{
// Do some stuff
var valExpression = ???; // append `.Value` to baseExpression
var updateExpression = ???; // append `.Update` to baseExpression
}
Run Code Online (Sandbox Code Playgroud)
但我真的不确定如何做到这一点......令人难以置信的是,任何正确方向的推动都会受到极大的影响.
当然; 如果你有baseExpression,那么像:
var valExpression = Expression.Lambda<Func<Bar, T>>(
Expression.PropertyOrField(baseExpression.Body, "Value"),
baseExpression.Parameters);
var updateExpression = Expression.Lambda<Func<Bar, bool>>(
Expression.PropertyOrField(baseExpression.Body, "Update"),
baseExpression.Parameters);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
984 次 |
| 最近记录: |