当前位置: 首页 > 编程语言 > C#

如何在不同(但兼容)模型之间转换lambda表达式?分享

时间:2023-04-10 18:07:02 C#

如何在不同(但兼容)模型之间转换lambda表达式?(基于电子邮件对话,现在记录信息共享)我有两个不同层的模型:publicclassTestDTO{publicintCustomerID{get;放;}}//...publicclassTest{publicintCustomerID{get;放;和我的DTO层的lambda:Expressionfc1=(TestDTOc1)=>c1.CustomerID=10;如何转换lambda(在一般情况下)以讨论其他模型:Expressionfc2={insertmagichere,basedonfc1}(显然,我们在相同的测试条件之后,但使用测试类型)?为此,您必须完全重建表达式树;参数将需要重新映射,并且现在与不同类型通信的所有成员访问都需要重新应用。幸运的是,ExpressionVisitor类使很多事情变得更容易;例如(做一般的一切,而不仅仅是Func谓词用法):classTypeConversionVisitor:ExpressionVisitor{publicTypeConversionVisitor(DictionaryparameterMap){this.parameterMap=parameterMap;}protectedoverrideExpressionVisitParameter(ParameterExpressionnode){//重新映射找到的参数Expression;if(!parameterMap.TryGetValue(node,outfound))found=base.VisitParameter(node);返回找到;}protectedoverrideExpressionVisitMember(MemberExpressionnode){//重新执行任何成员绑定varexpr=Visit(node.Expression);if(expr.Type!=node.Type){MemberInfonewMember=expr.Type.GetMember(node.Member.Name).Single();返回Expression.MakeMemberAccess(expr,newMember);}returnbase.VisitMember(node);这里我们传入一个参数字典来重新映射并将它应用到VisitParameter中。我们还在VisitMember中检查我们是否已切换类型(如果Visit涉及ParameterExpression或另一个MemberExpression,则可能发生这种情况):如果是这样,我们将尝试找到另一个具有相同名称的成员。接下来,我们需要一个通用的lambda转换重写器方法://允许稍后扩展到其他签名...privatestaticExpressionConvertImpl(Expressionfrom)whereTFrom:classwhereTTo:class{//找出函数中哪些类型不同-signaturevarfromTypes=from.Type.GetGenericArguments();vartoTypes=typeof(TTo).GetGenericArguments();if(fromTypes.Length!=toTypes.Length)thrownewNotSupportedException("不兼容的lambda函数类型签名");字典typeMap=newDictionary();for(inti=0;iparameterMap=newDictionary();ParameterExpression[]newParams=newParameterExpression[from.Parameters.Count];for(inti=0;i(body,newParams);}这需要一个任意表达式和一个TTo,通过以下方式转换为表达式:然后,将它们放在一起并公开我们的扩展方法://从上面插入:ConvertImpl//从上面插入:TypeConversionVisitor}etvo伊拉;一个通用的lambda转换例程,具体实现:Expression>fc2=fc1.Convert();可以使用AutoMapper(无表达式树):以上是C#学习教程:如何在不同(但兼容)的模型之间进行转换,在lambda表达式之间进行转换?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注——Mapper.CreateMap();...Funcfc1=(TestDTOc1)=>c1.CustomerID=10;Funcfc2=(测试t)=>fc1(Mapper.Map(t));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢