我使用了一些强类型表达式,这些表达式被序列化以允许我的UI代码具有强类型排序和搜索表达式.这些是类型的Expression<Func<TModel,TProperty>>
并且如此使用:SortOption.Field = (p => p.FirstName);
.对于这个简单的案例,我已经完美地完成了这项工作.
我用来解析"FirstName"属性的代码实际上重用了我们使用的第三方产品中的一些现有功能,并且它工作得很好,直到我们开始使用深层嵌套的属性(SortOption.Field = (p => p.Address.State.Abbreviation);
).此代码在支持深层嵌套属性的需求方面有一些非常不同的假设.
至于这段代码的作用,我并不是真的理解它而不是改变代码,我想我应该从头开始编写这个功能.但是,我不知道这样做的好方法.我怀疑我们可以做一些比做ToString()和执行字符串解析更好的事情.那么有什么好办法来处理琐碎和深层嵌套的案例呢?
要求:
p => p.FirstName
我需要一串"FirstName"
.p => p.Address.State.Abbreviation
我需要一串"Address.State.Abbreviation"
虽然对我的问题的答案并不重要,但我怀疑我的序列化/反序列化代码对将来发现这个问题的其他人有用,所以它在下面.同样,这段代码对这个问题并不重要 - 我只是觉得它可能对某些人有所帮助.请注意,DynamicExpression.ParseLambda
它来自动态LINQ的东西,Property.PropertyToString()
这是这个问题的关键.
/// <summary>
/// This defines a framework to pass, across serialized tiers, sorting logic to be performed.
/// </summary>
/// <typeparam name="TModel">This is the object type that you are filtering.</typeparam>
/// <typeparam name="TProperty">This is the property on the …
Run Code Online (Sandbox Code Playgroud) Func<TCollection, T>
我的代码中有一个.我用它来选择某些属性.
在调用另一个方法时我需要Expression<Func<TCollection, T>>
作为参数.
有什么办法转换(或创建)Func<TCollection, T>
到Expression<Func<TCollection, T>>
?
谢谢
既然我们可以:
Expression<Func<int, bool>> predicate = x => x > 5;
var result = Enumerable.Range(0,10).Where(predicate.Compile());
Run Code Online (Sandbox Code Playgroud)
我怎么能够:
Func<int,bool> predicate = x => x > 5;
Expression<Func<int,bool>> exp = predicate.Decompile();
Run Code Online (Sandbox Code Playgroud)
也就是说,我想得到相应Expression
的Func
.可能吗?
public class Demo
{
public void When(Func<Person, bool> condition)
{
if (!condition)
{
Log.Info("Condition not met.");
return;
}
// Do something
}
}
Run Code Online (Sandbox Code Playgroud)
在When
方法中,我想记录谓词或Func<bool>
返回false.但是,只记录"未满足的条件"并没有给我太多信息.如果我这样调用方法:
demo.When(x => x.Name == "John");
Run Code Online (Sandbox Code Playgroud)
有没有办法将该表达式转换为可读/有意义的字符串以进行日志记录?
之前的问题询问是否可以将已编译的委托转换为表达式树,例如:
当时理智的答案是:
但幸运的是,有一些非常疯狂/疯狂的伟大的人喜欢逆向工程的东西,他们让我们其他人的事情变得容易.
显然,可以将IL反编译为C#,因为Reflector会这样做,因此您原则上可以使用支持所有语句类型的CLR 4.0表达式树.这很有意思,因为编译器对Expression<>
lambdas 的内置特殊支持永远不会扩展为支持编译器中的构建语句表达式树并不重要.图书馆解决方案可填补这一空白.然后,我们将有一个高级别的起点,用于编写类似方面的代码操作,而不必混淆原始IL.
如上述相关问题的答案所述,有一些有希望的迹象,但我没有成功地发现自搜索以来是否取得了很大进展.
那么有人完成这项工作,还是走得很远?
注意: CLR 4.0现已发布.再看看的时间 - 看.
考虑这个课程:
public class Column<T>
{
public string Header { get; set; }
public Func<T, string> ValueExpression { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
像这样使用:
var columns = new List<Column<Employee>>
{
new Column<Employee> {Header = "Employee Id", ValueExpression = e => e.EmployeeID.ToString()},
new Column<Employee> {Header = "Name", ValueExpression = e => e.FirstName + " " + e.LastName},
new Column<Employee> {Header = "Employee Birthday Year", ValueExpression = e => e.BirthDate.HasValue ? e.BirthDate.Value.Year.ToString() : ""},
new Column<Employee> { Header = "test", ValueExpression = e => …
Run Code Online (Sandbox Code Playgroud)