рдЦреБрдж рдореИрдкрд░ рдпрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдЯреНрд░реАрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛

рдЫрд╡рд┐

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

рддреНрдпрд╛рдЧ


рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ: рд╣рдо рдПрдХ рдЖрджрд┐рдо рдореИрдкрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЕрдЪрд╛рдирдХ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдареЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ - рдРрд╕рд╛ рди рдХрд░реЗрдВред рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд▓реЗрдВ рдЬреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдвреЗрд░ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирддрд╛ рд╣реИред рдЕрдкрдиреА рдмрд╛рдЗрдХ рдореИрдкрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдФрд░ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдг рд╣реИрдВ:

  • рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЖрдк рд╢рдВрдХреБ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
  • рдЖрдк рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • рдЖрдкрдХреЛ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рдирд╛ рд╣реА рдкрд╕рдВрдж рд╣реИред

"рдореИрдкрд░" рд╢рдмреНрдж рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?


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

рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдкрд░ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ:

public interface IMapper<out TOut> { TOut Map(object source); } 

рдореИрдВ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ: рдпрд╣ рд╕рдмрд╕реЗ рдЖрджрд┐рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореИрдкрд░ (IMapper <TIn, Tout>) рдпрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдореБрдЦреМрдЯрд╛ (IMapper) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореИрдкрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ред

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


рдиреЛрдЯ: рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореИрдкрд░ рдХреЗ рдЕрдиреБрднрд╡рд╣реАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрди рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ - рдЗрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕реЗ рдкрдврд╝реЗрдВред рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рджреБрдирд┐рдпрд╛ рдХрднреА рднреА рдПрдХ рдЬреИрд╕реА рдирд╣реАрдВ рд╣реЛрдЧреАред

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

 Type outType = typeof(TOut); PropertyInfo[] outProperties = outType.GetProperties(); 

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

рд╣рдо рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЯрд╛рдЗрдк рдЯреВрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдпрд╛рдиреА, рдмрд╣реБрдд рд╣реА рд╡рд╕реНрддреБ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХреЛ "рдореИрдк" рдХрд░рддреЗ рд╣реИрдВред C # рдореЗрдВ, рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: System.Activator.CreateInstance ()ред рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдирдпрд╛ рдЯреБрдЯ (), рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЯреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рджреЛрдиреЛрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 ConstructorInfo outConstructor = outType.GetConstructor(Array.Empty<Type>()); Func<TOut> activator = outConstructor == null ? throw new Exception($"Default constructor for {outType.Name} not found") : Expression.Lambda<Func<TOut>>(Expression.New(outConstructor)).Compile(); 

рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВ - рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рд╣рдо рдЕрдкрдиреЗ рдореИрдкрд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рдХрд░ рджреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдЯреНрд░реАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реАрдЦрд╛, рдЕрд░реНрдерд╛рддреН, рд╡реЗ рдкрдЯреНрдЯрд┐рдХрд╛ рдХреЛ рдХреЛрдб рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ () => рдирдпрд╛ рдЯреБрдЯ ()ред

рдЕрдм рдЖрдкрдХреЛ рдореБрдЦреНрдп рдореИрдкрд░ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреА рдирдХрд▓ рдХрд░реЗрдЧрд╛ред рд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ: рд╣рдо рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓реЗ рдЧреБрдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкрд╛рдпрд╛ - рдкреНрд░рддрд┐рд▓рд┐рдкрд┐, рдпрджрд┐ рдирд╣реАрдВ - рдЖрдЧреЗ рдмрдврд╝реЗрдВред

 TOut outInstance = _activator(); PropertyInfo[] sourceProperties = source.GetType().GetProperties(); for (var i = 0; i < sourceProperties.Length; i++) { PropertyInfo sourceProperty = sourceProperties[i]; string propertyName = sourceProperty.Name; if (_outProperties.TryGetValue(propertyName, out PropertyInfo outProperty)) { object sourceValue = sourceProperty.GetValue(source); outProperty.SetValue(outInstance, sourceValue); } } return outInstance; 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ BasicMapper рд╡рд░реНрдЧ рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ рдЙрдирдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд░реЛрдд рдпрд╛ рддреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡рд╕реНрддреБ рдпрд╛ рдПрдХ рдЕрдирд╛рдо рд╡рд╕реНрддреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдореБрдХреНрдХреЗрдмрд╛рдЬреА


рдкреНрд░рддрд┐рдмрд┐рдВрдм рдорд╣рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдзреАрдорд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рд╕реЗ рдореЗрдореЛрд░реА рдЯреНрд░реИрдлрд╝рд┐рдХ рдмрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ GC рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдФрд░ рднреА рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╕рд┐рд░реНрдл PropertyInfo.SetValue рдФрд░ PropertyInfo.GetValue рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред GetValue рд╡рд┐рдзрд┐ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рд▓рд┐рдкрдЯреЗ (рдмреЙрдХреНрд╕рд┐рдВрдЧ) рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЖрд╡рдВрдЯрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред

рдореИрдкрд░ рдЖрдорддреМрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ... рдирд╣реАрдВ, рдПрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рд╡рд╕реНрддреБрдПрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреБрдЫ рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд╛рди рдкрд░, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рд╛рдердорд┐рдХ рдСрдкрд░реЗрд╢рди рдкрд░ рд╕реНрдореГрддрд┐ рдирд╣реАрдВ рдЦреЛрдирд╛ рдЪрд╛рд╣рддрд╛ред

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

рд╕рдВрдХрд▓рд┐рдд рдореИрдкрд░


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ: рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдирдпрд╛ рдХрд┐рдпрд╛ рдерд╛ред рдирдпрд╛ (рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рдЗрдиреНрдлреЛ)ред рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░ рдирдИ рд╡рд┐рдзрд┐ рдХреЛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рд╕реА # рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рддрдерд╛рдХрдерд┐рдд рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ "рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЪреАрдиреАред"

рдпрд╣рд╛рдВ рдХреБрдЫ рдСрдкрд░реЗрд╢рди рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рдореИрдкрд░ рдореЗрдВ рдХрд░реЗрдВрдЧреЗ:

  • рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛ - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ред рдЙрдкрд▓рдмреНрдз (рдкреНрд░рдХрд╛рд░, рд╕реНрдЯреНрд░рд┐рдВрдЧ)ред рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХрд╛ рдирд╛рдо рд╣реИред
  • рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ - Expression.Assign (рдПрдХреНрд╕рдкреНрд░реЗрд╢рди, рдПрдХреНрд╕рдкреНрд░реЗрд╢рди)ред рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдо рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдо рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред
  • рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкреНрд░реЙрдкрд░реНрдЯреА рддрдХ рдкрд╣реБрдВрдЪ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди.рдкреНрд░реЙрдкрд░реНрдЯреА (рдПрдХреНрд╕рдкреНрд░реЗрд╢рди, рдкреНрд░реЙрдкрд░реНрдЯреАрдЗрдиреНрдлреЛ) рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рдФрд░ PropertyInfo рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╡рд╕реНрддреБ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред

рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде, рд╣рдо рдЪрд░, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдЧреБрдг рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╣рдо рдпрд╣ рднреА рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдЯреНрд░реА рдХреЛ рдлрдВрдХ <рдСрдмреНрдЬреЗрдХреНрдЯ, рдЯреБрдЯ> рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпреЛрдЬрдирд╛ рдпрд╣ рд╣реИ: рд╣рдореЗрдВ рдПрдХ рдЪрд░ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЯрд╛рдЗрдк рдЯреВрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдРрд╕реЗ рднрд╛рд╡ рдмрдирд╛рдПрдВ рдЬреЛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рджреВрд╕рд░реЗ рдХреЛ рд╕реМрдВрдкрддреЗ рд╣реИрдВред

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛ред

 var parameter = Expression.Parameter(typeof(object), "source"); 

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

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

 Expression sourceValue = Expression.Property(sourceInstance, sourceProperty); Expression outValue = Expression.Property(outInstance, outProperty); expressions.Add(Expression.Assign(outValue, sourceValue)); 

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

рдареАрдХ рд╣реИ, рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЙрди рд╕рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рдмрдирд╛рдП рдереЗред рд╣рдо рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ? рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреЙрдбреА рдЪрд░ рдореЗрдВ "рдмреЙрдбреА" рд╣реЛрддреА рд╣реИред "рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп" рдПрдХ рд╢рд░реАрд░ рд╣реИ, рд╣реИ рдирд╛? рдЦреИрд░, рдЬрд┐рд╕реЗ рд╣рдо рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВред рддреЛ, рдПрдХреНрд╕рдкреНрд░реЗрд╢рди.рдмреНрд▓реЙрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣реА рд╣реИред рдЪреВрдБрдХрд┐ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрдХреНрд╕ рднреА рдПрдХ рд╕реНрдХреЛрдк рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╣рд╛рдБ рдРрд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рд╡рд╣рд╛рдБ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдВрдЧреЗ - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ sourceInstance рдФрд░ outInstanceред

 var body = Expression.Block(new[] {sourceInstance, outInstance}, expressions); return Expression.Lambda<Func<object, TOut>>(body, parameter).Compile(); 

рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ, рд╣рдореЗрдВ Func <рдСрдмреНрдЬреЗрдХреНрдЯ, TOut>, рдЕрд░реНрдерд╛рдд рдорд┐рд▓рддрд╛ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реА рдореБрд╢реНрдХрд┐рд▓реЗрдВ, рдЖрдк рдХреНрдпреЛрдВ рдкреВрдЫрддреЗ рд╣реИрдВ? рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐, рдкрд╣рд▓реЗ, рд╣рдо рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдорд╛рдиреЛрдВ рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╕рдордп рдореБрдХреНрдХреЗрдмрд╛рдЬреА рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╣рдо PropertyInfo.GetValue рдФрд░ PropertyInfo.SetValue рддрд░реАрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреБрдЫ рдзреАрдореА рд╣реИрдВред

рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирдЯреНрд░реА рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдИрдПрд▓ рд╣реИ, рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рддрд░рд╣ (рд▓рдЧрднрдЧ) рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдХреНрдпреЛрдВ "рд╕рдВрдХрд▓рд┐рдд рдореИрдкрд░" рддреЗрдЬреА рд╕реЗ рд╣реИ? рдлрд┐рд░: рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╛рджрд╛ рдЖрдИрдПрд▓ рд╣реИред рд╡реИрд╕реЗ, рд╣рдо рдмреЗрдВрдЪрдорд╛рд░реНрдХрдбреЙрдЯрдиреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рд╡рд┐рдзрд┐рдореАрдирддреНрд░реБрдЯрд┐StdDevрдЕрдиреБрдкрд╛рддрдЖрд╡рдВрдЯрд┐рдд
AutoMapper1,291.6 рд╣рдореЗрдВ3.3173 рд╣рдореЗрдВ3.1030 рд╣рдореЗрдВ1.00312.5 рдХреЗрдмреА
Velo_BasicMapper11,987.0 рд╣рдореЗрдВ33.8389 рд╣рдореЗрдВ28.2570 рд╣рдореЗрдВ9.283437.5 рдХреЗрдмреА
Velo_CompiledMapper341.3 рд╣рдореЗрдВ2.8230 рд╣рдореЗрдВ2.6407 рд╣рдореЗрдВ0.26312.5 рдХреЗрдмреА

Ratio рдХреЙрд▓рдо рдореЗрдВ "рд╕рдВрдХрд▓рд┐рдд рдореИрдкрд░" (CompiledMapper) рдиреЗ AutoMapper рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдпрд╛ (рдпрд╣ рдЖрдзрд╛рд░рднреВрдд рд╣реИ, рдЕрд░реНрдерд╛рдд 1)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЦреБрд╢реА рдирд╣реАрдВ рдордирд╛рддреЗ: AutoMapper рдореЗрдВ рд╣рдорд╛рд░реА рдмрд╛рдЗрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВред рдЗрд╕ рдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдореИрдВ рдмрд╕ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЯреНрд░реАрдЬрд╝ "рдХреНрд▓рд╛рд╕рд┐рдХ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдПрдкреНрд░реЛрдЪ" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ рдореИрдкрд░ рд▓рд┐рдЦрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдкрд░рд╛рд╡рд░реНрддрди рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди, Serialization / Deserialization, CRUD рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА, SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рдпрд╣ рд╕рдм рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдкрд░рд╛рд╡рд░реНрддрди.рдкреНрд░рдорд╛рдг рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореИрдкрд░ рдПрдХ рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдпрд╣ рд╕рдм рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдкреБрдирд╢реНрдЪ: рдпрджрд┐ рдЖрдк рдХреБрдЫ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ JSON рдХрдирд╡рд░реНрдЯрд░ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП ред

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


All Articles