рд╣рдо рд░реЛрдЬрд▓рд┐рди рдФрд░ рдХреЛрдб рдЬреЗрдирд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдЯреЛрдореИрдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд░реЛрдЬрд╝рд▓рд┐рди рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ред рддрддреНрдХрд╛рд▓реАрди рдХрд╛рд░реНрдп рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдерд╛ред рдЕрдм рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛрдЧрд╛ред


рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдСрдЯрдордкреИрдкрд░ рдЬреИрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред


рдкрд░рд┐рдЪрдп


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рдордп рдореИрдкрд░ (AOTMapper) рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдореИрдкрд░ рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдЬреЗрдиреЗрд░рд┐рдХ MapTo<> рд╡рд┐рдзрд┐ MapTo<> ред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░реЗрдЧрд╛ рдФрд░ MapToUser рдПрдХреНрд╕рдЯреЗрдВрд╢рди MapToUser рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛, рдЬрд╣рд╛рдВ User рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ MapTo<> рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ MapTo<> ред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рд▓реЗрдВ:


 namespace AOTMapper.Benchmark.Data { public class UserEntity { public UserEntity() { } public UserEntity(Guid id, string firstName, string lastName) { this.Id = id; this.FirstName = firstName; this.LastName = lastName; } public Guid Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } public class User { public string FirstName { get; set; } public string LastName { get; set; } public string Name { get; set; } } } 

рдЙрддреНрдкрдиреНрди MapToUser рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 public static AOTMapper.Benchmark.Data.User MapToUser(this AOTMapper.Benchmark.Data.UserEntity input) { var output = new AOTMapper.Benchmark.Data.User(); output.FirstName = input.FirstName; output.LastName = input.LastName; output.Name = ; // missing property return output; } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдорд╛рди рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рд╕рднреА рдЧреБрдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдмрджрд▓реЗ рдореЗрдВ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореИрдЪ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рд╡реЗ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреЛ "рд▓рдЯрдХрд╛" рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:


 public static AOTMapper.Benchmark.Data.User MapToUser(this AOTMapper.Benchmark.Data.UserEntity input) { var output = new AOTMapper.Benchmark.Data.User(); output.FirstName = input.FirstName; output.LastName = input.LastName; output.Name = $"{input.FirstName} {input.LastName}"; return output; } 

MapToUser рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди, MapTo<User> рдХреЙрд▓ MapTo<User> рдХреЛ MapToUser рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ MapToUser ред


рдпрд╣ рдЧрддрд┐ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



AOTMapper рдХреЛ рдиреБрдЧреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 Install-Package AOTMapper 

рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреБрдЫ рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ AutoMapper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкреАрдбрд╝рд╛ рджреАред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреБрдЫ рдЕрдореВрд░реНрдд User рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдВрдЯреЗрд▓реАрдЬреЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реЗ рдирдХреНрд╢реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреА рддрд▓рд╛рд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдирдХреНрд╢реЗ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред рдЬрд░рд╛ рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдХреМрди рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред


рджреВрд╕рд░реЗ, рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдо рдЕрдкрдиреЗ рдореИрдкрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ AutoMapper рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдкрд░ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрддреЗрдВ рд╣реИрдВред рдореЗрд░реЗ рдЫреЛрдЯреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рд╕рдордп рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдпрд╣ рдФрд╕рддрди 140-150ns рдкреНрд░рддрд┐ рдХреЙрд▓ рд╣реИред рд╕реНрд╡рдпрдВ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдорд╛рдк рдкрд░рд┐рдгрд╛рдо рдХрдо рд╣реИрдВред


рд╡рд┐рдзрд┐рдореАрдирддреНрд░реБрдЯрд┐StdDevрдЬрдирд░рд▓ режрдЬрдирд░рд▓ резрдЬрдирд░рд▓ 2рдЖрд╡рдВрдЯрд┐рдд
AutoMapperToUserEntity151.84 рдПрди.рдПрд╕.1.9952 рдПрди.рдПрд╕.1.8663 рдПрди.рдПрд╕.0.0253--80 рдмреА
AOTMapperToUserEntity10.41 рдПрди.рдПрд╕.0.2009 рдПрди.рдПрд╕.0.1879 рдПрди.рдПрд╕.0.0152--рекред рдм
AutoMapperToUser197.51 рдПрди.рдПрд╕.2.9225 рдПрди.рдПрд╕.2.5907 рдПрди.рдПрд╕.0.0787--реирек B рдмреА
AOTMapperToUser46.46 рдПрди.рдПрд╕.0.3530 рдПрди.рдПрд╕.0.3129 рдПрди.рдПрд╕.0.0686--216 рдмреА

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдореИрдкрд░ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рдпрд╣ рддрдереНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдмрдбрд╝реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рдкрд╛рд╕ рд╕реНрд╡рдпрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╣реИрдВ (рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛрдб рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛):


 private void Handle(OperationAnalysisContext context) { var syntax = context.Operation.Syntax; if (syntax is InvocationExpressionSyntax invocationSytax && invocationSytax.Expression is MemberAccessExpressionSyntax memberAccessSyntax && syntax.DescendantNodes().OfType<GenericNameSyntax>().FirstOrDefault() is GenericNameSyntax genericNameSyntax && genericNameSyntax.Identifier.ValueText == "MapTo") { var semanticModel = context.Compilation.GetSemanticModel(syntax.SyntaxTree); var methodInformation = semanticModel.GetSymbolInfo(genericNameSyntax); if (methodInformation.Symbol.ContainingAssembly.Name != CoreAssemblyName) { return; } var fromTypeInfo = semanticModel.GetTypeInfo(memberAccessSyntax.Expression); var fromTypeName = fromTypeInfo.Type.ToDisplayString(); var typeSyntax = genericNameSyntax.TypeArgumentList.Arguments.First(); var toTypeInfo = semanticModel.GetTypeInfo(typeSyntax); var toTypeName = toTypeInfo.Type.ToDisplayString(); var properties = ImmutableDictionary<string, string>.Empty .Add("fromType", fromTypeName) .Add("toType", toTypeName); context.ReportDiagnostic(Diagnostic.Create(AOTMapperIsNotReadyDescriptor, genericNameSyntax.GetLocation(), properties)); } } 

рд╡рд╣ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддрд╛ рд╣реИ рд╡рд╣ MapTo<> рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╣ рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрд╕ рдЗрдХрд╛рдИ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ MapTo<> рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд┐рдзрд┐ рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдПрдХ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред


рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ AOTMapperCodeFixProvider рдЕрдВрджрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ AOTMapperCodeFixProvider ред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рди рдкрд░ рд╣рдо рдХреЛрдб рдЬрдирд░реЗрд╢рди рдЪрд▓рд╛рдПрдВрдЧреЗред рдлрд┐рд░ рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХреЛ MapTo<> рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо AOTMapperGenerator рдХреЙрд▓ AOTMapperGenerator рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред


рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 private async Task<Document> Handle(Diagnostic diagnostic, CodeFixContext context) { var fromTypeName = diagnostic.Properties["fromType"]; var toTypeName = diagnostic.Properties["toType"]; var document = context.Document; var semanticModel = await document.GetSemanticModelAsync(); var root = await diagnostic.Location.SourceTree.GetRootAsync(); var call = root.FindNode(diagnostic.Location.SourceSpan); root = root.ReplaceNode(call, SyntaxFactory.IdentifierName($"MapTo{toTypeName.Split('.').Last()}")); var pairs = ImmutableDictionary<string, string>.Empty .Add(fromTypeName, toTypeName); var generator = new AOTMapperGenerator(document.Project, semanticModel.Compilation); generator.GenerateMappers(pairs, new[] { "AOTMapper", "Mappers" }); var newProject = generator.Project; var documentInNewProject = newProject.GetDocument(document.Id); return documentInNewProject.WithSyntaxRoot(root); } 

AOTMapperGenerator рд╕реНрд╡рдпрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдореИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдХрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 public void GenerateMappers(ImmutableDictionary<string, string> values, string[] outputNamespace) { foreach (var value in values) { var fromSymbol = this.Compilation.GetTypeByMetadataName(value.Key); var toSymbol = this.Compilation.GetTypeByMetadataName(value.Value); var fromSymbolName = fromSymbol.ToDisplayString().Replace(".", ""); var toSymbolName = toSymbol.ToDisplayString().Replace(".", ""); var fileName = $"{fromSymbolName}_To_{toSymbolName}"; var source = this.GenerateMapper(fromSymbol, toSymbol, fileName); this.Project = this.Project .AddDocument($"{fileName}.cs", source) .WithFolders(outputNamespace) .Project; } } private string GenerateMapper(INamedTypeSymbol fromSymbol, INamedTypeSymbol toSymbol, string fileName) { var fromProperties = fromSymbol.GetAllMembers() .OfType<IPropertySymbol>() .Where(o => (o.DeclaredAccessibility & Accessibility.Public) > 0) .ToDictionary(o => o.Name, o => o.Type); var toProperties = toSymbol.GetAllMembers() .OfType<IPropertySymbol>() .Where(o => (o.DeclaredAccessibility & Accessibility.Public) > 0) .ToDictionary(o => o.Name, o => o.Type); return $@" public static class {fileName}Extentions {{ public static {toSymbol.ToDisplayString()} MapTo{toSymbol.ToDisplayString().Split('.').Last()}(this {fromSymbol.ToDisplayString()} input) {{ var output = new {toSymbol.ToDisplayString()}(); { toProperties .Where(o => fromProperties.TryGetValue(o.Key, out var type) && type == o.Value) .Select(o => $" output.{o.Key} = input.{o.Key};" ) .JoinWithNewLine() } { toProperties .Where(o => !fromProperties.TryGetValue(o.Key, out var type) || type != o.Value) .Select(o => $" output.{o.Key} = ; // missing property") .JoinWithNewLine() } return output; }} }} "; } 

рдирд┐рд╖реНрдХрд░реНрд╖


рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореИрдкрд░ рд╣реИ рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИред рдпреЛрдЬрдирд╛рдПрдБ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрдиреНрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реИред рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдЬреЛрдбрд╝реЗрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрди рдХреА рдЦрдкрдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдм рддрдХ рдпрд╣ рджреЗрд░реА рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi459771/


All Articles