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

如何自动将.NET函数调用映射到属性?分享

时间:2023-04-11 01:26:43 C#

如何自动将.NET函数调用映射到属性?编辑:这最初用于1:1映射,但我发现我需要更复杂的递归映射,所以在这里发布了一个新问题:HowtorecursivelymapentitiestoviewmodelsusingAutomapperfunctioncalls?我正在尝试使用ServiceStackConvertTo方法将实体类函数一般映射到视图模型。这映射了所有相似的类型和属性名称并且工作正常,但我想找到一种方法将函数的结果映射到属性。这是一些代码实体示例:publicclassItem{publiclongId{get;设置;}publicListGetProducts(){returnRepository.GetAll();}}ViewModel示例:publicclassItemViewModel{publiclongId{get;set;}公共列表产品{get;set;}}理想的结果是使用map函数查看实体类,找到一个符合返回类型的方法,函数名是“Get”+属性名,然后执行,并将结果映射到视图模型。虽然您可能会发现诸如Automapper或ValueInjecter之类的东西已经包含此功能,但没有什么能阻止您编写一个快速的小实用方法:publicTTargetMapToViewModel(TSourcesource)whereTTarget:new(){varsourceType=source.GetType();vartargetProperties=typeof(TTarget).GetProperties(BindingFlags.Public|BindingFlags.Instance);varsourceProperties=sourceType.GetProperties(BindingFlags.Public|BindingFlags.Instance);varsourceMethods=sourceTypes.GetMethods(BindingFlags(.Public|BindingFlags.Instance);vartarget=Activator.CreateInstance();foreach(varpropintargetProperties){varsourceProp=sourceProperties.FirstOrDefault(x=>x.Name==prop.Name);if(sourceProp!=null){prop.SetValue(target,sourceProp.GetValue(source,null),null);}else{varsourceMethod=sourceMethods.FirstOrDefault(x=>x.Name=="获取"+prop.Name);if(sourceMethod!=null){prop.SetValue(target,sourceMethod.Invoke(source,null),null);}}}returntarget;}上面.FirstOrDefault调用中的条件只使用Name,但你可以将它们扩展到任何你喜欢的。要使用它,只需调用它:varitemViewModel=MapToViewModel(item);如果常规模型中的方法有任何参数,请小心。如果您发现您的模型太复杂(或不遵循一两个命名约定),您最好使用类似AutoMapper的东西。但是对于简单的映射,像这样的东西应该可以解决问题。很难用ServiceStack为这种映射制定一个通用的解决方案,因为您基本上必须自己编写代码来将Products匹配到GetProducts。您可以使用另一个映射库,如AutoMapper,它会自动使用GetX()填充X//一次configMapper.CreateMap();映射器.AssertConfigurationIsValid();//每当你映射Itemitem=//无论ItemViewModelviewModel=Mapper.Map(item);//viewModel.Products由item.GetProducts()填充手动更改某些内容的映射方式也更容易,例如,您可以使用此CreateMap手动设置:Mapper.CreateMap().ForMember(dest=>dest.Products,opt=>opt.ResolveUsing(src=>src.GetProducts()));看起来AutoMapper是一个更强大的映射器。即使您将ServiceStack用于其他部分,也可能值得使用AutoMapper进行映射。以上是C#学习教程:Howtoautomaticallymap.NETfunctioncallstoproperties?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: