【发布时间】:2014-10-13 15:07:15
【问题描述】:
我正在尝试动态组合 lambda 表达式。下面的代码将解释我想要什么。这不是将 a=>b 和 b=>c 组合为 a=>c 的情况。相反,我想通过重用转换表达式来防止代码重复:
class User // convert from...
{
public string FirstName {get;set;}
public string LastName {get;set;}
}
class Person // convert to...
{
public string Name
}
public class UserTransaction
{
User FromUser {get;set;}
User ToUser {get;set;}
decimal Amount {get;set;}
}
public class PersonTransaction
{
Person FromPerson {get;set;}
Person ToPerson {get;set;}
bool IsPositive;
}
Expression<Func<User, Person>> ToPerson = u => new Person {Name = u.FirstName + " " + u.LastName};
Expression<Func<UserTransaction, PersonTransaction>> PersonTransaction = ut => new PersonTransaction {
FromPerson = FromUser.Compile()(ut.FromUser), // Actually, I do not want to compile
ToPerson = ToUser.Compile()(ut.FromUser), // (or double code)
IsPositive = ut.Amount > 0
}
在上面的示例中,我已经有一个表达式可以将用户转换为人。我不想复制或编译此代码。我尝试通过手动编辑表达式树来去除“编译”调用。我没有成功。有没有人尝试过类似的方法并成功了?
【问题讨论】:
-
您应该研究像 AutoMapper 这样的工具,它是为进行此类转换而构建的。
-
@Andrew 我在我的应用程序的完全不同的部分使用 AutoMapper。它用于自动将对象的内容复制到另一个对象。它如何转换表达式? (一些上下文:表达式用于最终生成 sql 查询。)
-
它不处理表达式,但从您的代码看来,您正在尝试将
User转换为Person和UserTransaction到PersonTransaction-- 两种类型之间的映射 -
嗯,我需要一个从 UserTransaction 映射到 PersonTransaction 的 表达式。这个表达式被输入到现有代码中。
标签: c# lambda merge expression