{"id":672,"date":"2017-09-16T00:27:39","date_gmt":"2017-09-15T21:27:39","guid":{"rendered":"http:\/\/enisnecipoglu.com\/?p=672"},"modified":"2017-09-16T13:17:10","modified_gmt":"2017-09-16T10:17:10","slug":"c-class-propertylerini-foreach-ile-aktarma","status":"publish","type":"post","link":"https:\/\/enisnecipoglu.com\/en\/c-class-propertylerini-foreach-ile-aktarma\/","title":{"rendered":"C# Class Property&#8217;lerini foreach ile aktarma"},"content":{"rendered":"<p>Ba\u015fl\u0131k asl\u0131nda bu i\u00e7eri\u011fi tam anlam\u0131yla anlatm\u0131yor. Fakat b\u00f6yle bir \u015feyi google&#8217;da arayacak olsayd\u0131m buna benzer bir \u015fey yazard\u0131m herhalde.<\/p>\n<p>Bug\u00fcn de\u011finmek istedi\u011fim konu, bana birden fazla kez sorulan bir \u015fey asl\u0131nda. \u00d6nce \u00e7\u00f6zmek istedi\u011fimiz sorundan bahsedelim. \u0130kinci olarak bunu nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 yapal\u0131m yani sorunu \u00e7\u00f6zelim. \u00dc\u00e7\u00fcnc\u00fc a\u015famada ise de bunu di\u011fer projelerimizde direk kullanabilece\u011fimiz \u015fekle \u00e7evirip dll almay\u0131 yapal\u0131m.<\/p>\n<h2>Sorunsal<\/h2>\n<p>Diyelim ki elimizde i\u00e7inde property&#8217;leri olan C# class&#8217;\u0131 var. Birisi veritaban\u0131m\u0131zdan gelen bir instance ve di\u011feri de kullan\u0131c\u0131 taraf\u0131ndan d\u00fczenlenmi\u015f olan instance. \u0130stedi\u011fim \u015fey ise k\u0131sa yoldan d\u00fczenlenmi\u015f class&#8217;dakileri orjinal class&#8217;a aktarma. Fakat do\u011frudan d\u00fczenlenmi\u015fi orjinale atayam\u0131yorum \u00e7\u00fcnk\u00fc d\u00fczenlenmi\u015fte null alanlar var veya de\u011fi\u015ftirmek istemedi\u011fim alanlar var. Bunu do\u011frudan uzun yoldan \u015fu \u015fekilde yapabilirim.<\/p>\n<p>\u00d6nce class\u0131m:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\">&nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> User<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">public<\/span> Guid ID <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Name <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Surname <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> DateTime BirthDate <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> PasswordHash <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> DateTime RegisterDate <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Uzun uzun yapaca\u011f\u0131m i\u015flem:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\"><span class=\"co1\">\/\/Bu \u00fczerinde de\u011fi\u015fiklik yapmak istedi\u011fim instance<\/span><br \/>\nUser orignalUser <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> User <span class=\"br0\">&#123;<\/span> ID <span class=\"sy0\">=<\/span> Guid<span class=\"sy0\">.<\/span><span class=\"me1\">NewGuid<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>, BirthDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddYears<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">25<\/span><span class=\"br0\">&#41;<\/span>, Name <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ahmet&quot;<\/span>, Surname <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ahmeto\u011flu&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/Bu da kullan\u0131c\u0131 taraf\u0131ndan de\u011fi\u015fiklik yap\u0131lm\u0131\u015f model<\/span><br \/>\nUser editedUser <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> User <span class=\"br0\">&#123;<\/span> ID <span class=\"sy0\">=<\/span> orignalUser<span class=\"sy0\">.<\/span><span class=\"me1\">ID<\/span>, Name <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ahmet&quot;<\/span>, Surname <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Y\u0131lmaz&quot;<\/span>, BirthDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddYears<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">26<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/editedUser'da birden fazla null alan var. ve di\u011ferinden farkl\u0131 olan alanlar da var.<\/span><br \/>\n<span class=\"co1\">\/\/Bunu originalUser de\u011fi\u015fkenine aktarmak i\u00e7in \u015funu yapabilirim.<\/span><br \/>\norignalUser<span class=\"sy0\">.<\/span><span class=\"me1\">Name<\/span> <span class=\"sy0\">=<\/span> editedUser<span class=\"sy0\">.<\/span><span class=\"me1\">Name<\/span><span class=\"sy0\">;<\/span><br \/>\norignalUser<span class=\"sy0\">.<\/span><span class=\"me1\">Surname<\/span> <span class=\"sy0\">=<\/span> editedUser<span class=\"sy0\">.<\/span><span class=\"me1\">Surname<\/span><span class=\"sy0\">;<\/span><br \/>\norignalUser<span class=\"sy0\">.<\/span><span class=\"me1\">BirthDate<\/span> <span class=\"sy0\">=<\/span> editedUser<span class=\"sy0\">.<\/span><span class=\"me1\">BirthDate<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/...<\/span><br \/>\n<span class=\"co1\">\/\/Gibi t\u00fcm de\u011fi\u015ftirmek istedi\u011fim property'lerin atamas\u0131n\u0131 elle yapabilirim.<\/span><\/div><\/div>\n<p>Fakat istemi\u015f oldu\u011fum \u015fey, editedUser&#8217;daki null olmayan alanlar\u0131 de\u011fi\u015ftiren ve ID gibi de\u011fi\u015fmesin istemedi\u011fim alanlar\u0131 de\u011fi\u015ftirmeyen bir algoritmaya ihtiyac\u0131m olacak. \u015eu \u00f6rnekte \u00e7ok b\u00fcy\u00fck bir s\u0131k\u0131nt\u0131 yok fakat \u00e7ok say\u0131da property&#8217;den olu\u015fan modellerimizde b\u00f6yle bir yol izlemek tamamen amelelikten ba\u015fka bir \u015fey olmayacakt\u0131r.<\/p>\n<h2>Basit \u00c7\u00f6z\u00fcm<\/h2>\n<p>\u0130lk akla gelen \u015fey ise bir d\u00f6ng\u00fc; Mesela <strong>foreach<\/strong>&#8230; Benim User class&#8217;\u0131m\u0131n i\u00e7indeki property&#8217;leri teker teker d\u00f6n\u00fcp bir instance&#8217;dan al\u0131p di\u011fer instance&#8217;a aktarmak istiyorum. Bunu ise <strong>System&#8217;<\/strong>den gelen\u00a0<strong>Type<\/strong> class&#8217;\u0131n\u0131n bir metodu olan\u00a0<strong>GetProperties()\u00a0<\/strong>metodu ile yapaca\u011f\u0131m. kullan\u0131m\u0131 \u015fu \u015fekilde:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\"><span class=\"co1\">\/\/Bu \u00fczerinde de\u011fi\u015fiklik yapmak istedi\u011fim instance<\/span><br \/>\nUser orignalUser <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> User <span class=\"br0\">&#123;<\/span> ID <span class=\"sy0\">=<\/span> Guid<span class=\"sy0\">.<\/span><span class=\"me1\">NewGuid<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>, BirthDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddYears<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">25<\/span><span class=\"br0\">&#41;<\/span>, Name <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ahmet&quot;<\/span>, Surname <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ahmeto\u011flu&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/Bu da kullan\u0131c\u0131 taraf\u0131ndan de\u011fi\u015fiklik yap\u0131lm\u0131\u015f model<\/span><br \/>\nUser editedUser <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> User <span class=\"br0\">&#123;<\/span> ID <span class=\"sy0\">=<\/span> orignalUser<span class=\"sy0\">.<\/span><span class=\"me1\">ID<\/span>, Name <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ahmet&quot;<\/span>, Surname <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Y\u0131lmaz&quot;<\/span>, BirthDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddYears<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">26<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ Herhangi bir kontrol olmadan \u015fu \u015fekilde editedUser'\u0131 originalUser'a \u015fu \u015fekilde aktarabilirim:<\/span><br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> property <span class=\"kw1\">in<\/span> <span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>User<span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GetProperties<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nproperty<span class=\"sy0\">.<\/span><span class=\"me1\">SetValue<\/span><span class=\"br0\">&#40;<\/span>orignalUser, property<span class=\"sy0\">.<\/span><span class=\"me1\">GetValue<\/span><span class=\"br0\">&#40;<\/span>editedUser<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Buna bir de null kontrol\u00fc yazabilirim ekleyelim:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\">&nbsp;<span class=\"co1\">\/\/ editedUser'da null olan de\u011ferleri pas ge\u00e7ip bir sonraki property'e ge\u00e7mesi i\u00e7in \u015fu null kontrol\u00fcn\u00fc ekledik:<\/span><br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> property <span class=\"kw1\">in<\/span> <span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>User<span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GetProperties<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> editedProp <span class=\"sy0\">=<\/span> property<span class=\"sy0\">.<\/span><span class=\"me1\">GetValue<\/span><span class=\"br0\">&#40;<\/span>editedUser<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span> editedProp <span class=\"sy0\">==<\/span> <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span><br \/>\nproperty<span class=\"sy0\">.<\/span><span class=\"me1\">SetValue<\/span><span class=\"br0\">&#40;<\/span>orignalUser, editedProp<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>&nbsp;<\/p>\n<p>ID gibi herhangi bir \u015fekilde de\u011fi\u015fiklik olmas\u0131n\u0131 istemedi\u011fimiz property&#8217;leri ay\u0131rt etmek i\u00e7in yeni bir attribute yazal\u0131m. Class&#8217;\u0131m\u0131 Property&#8217;lerimin \u00fczerine attribute olarak yazabilmek i\u00e7in\u00a0<strong>Attribute\u00a0<\/strong>class&#8217;\u0131ndan t\u00fcrettim:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\"><span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> IgnoreCopy <span class=\"sy0\">:<\/span> Attribute<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>\u015eimdilik bunun i\u00e7ini bo\u015f b\u0131rakt\u0131m.\u00a0<strong>User<\/strong> class&#8217;\u0131ma giderek\u00a0<strong>ID&#8217;<\/strong>nin \u00fczerine\u00a0<strong>IgnoreCopy<\/strong> attribute&#8217;\u00fcm\u00fc ekledim. Yeni hali a\u015fa\u011f\u0131daki gibi:<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\">&nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> User<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"br0\">&#91;<\/span>IgnoreCopy<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"kw1\">public<\/span> Guid ID <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Name <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Surname <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> DateTime BirthDate <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> PasswordHash <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">public<\/span> DateTime RegisterDate <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>\u015eimdi\u00a0<strong>foreach\u00a0<\/strong>foreach i\u00e7erisindeki null kontrol\u00fcme bir kontrol daha ekliyorum, bu attribute&#8217;\u00fcn olup olmad\u0131\u011f\u0131:<\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\">\u00a0<span class=\"co1\">\/\/ property'lerin IgnoreCopy ad\u0131ndaki do\u011frudan eklenmi\u015f bir attribute'\u00fc olup olmad\u0131\u011f\u0131n\u0131n kontrol\u00fcn\u00fc de yapt\u0131k:<\/span><br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> property <span class=\"kw1\">in<\/span> <span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>User<span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GetProperties<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>property<span class=\"sy0\">.<\/span><span class=\"me1\">GetCustomAttributes<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>IgnoreCopy<span class=\"br0\">&#41;<\/span>, <span class=\"kw1\">false<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Length<\/span> <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> editedProp <span class=\"sy0\">=<\/span> property<span class=\"sy0\">.<\/span><span class=\"me1\">GetValue<\/span><span class=\"br0\">&#40;<\/span>editedUser<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>editedProp <span class=\"sy0\">==<\/span> <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span><br \/>\nproperty<span class=\"sy0\">.<\/span><span class=\"me1\">SetValue<\/span><span class=\"br0\">&#40;<\/span>orignalUser, editedProp<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<h1>Her objeye uygun hale getirme<\/h1>\n<p><img loading=\"lazy\" class=\"wp-image-677 alignleft\" src=\"http:\/\/enisnecipoglu.com\/wp-content\/uploads\/2017\/09\/Ekran-Al\u0131nt\u0131s\u0131.png\" alt=\"\" width=\"180\" height=\"126\" \/>ModelMixer ad\u0131nda yeni bir\u00a0<strong>ClassLibrary<\/strong> a\u00e7t\u0131m.\u00a0\u0130\u00e7erisinde\u00a0<strong>Attributes\u00a0<\/strong>ve\u00a0<strong>Processes<\/strong> ad\u0131nda 2 klas\u00f6r olu\u015fturdum.\u00a0Attribute&#8217;lerimi ve i\u015flemlerimi bu klas\u00f6rlerin alt\u0131nda depolayaca\u011f\u0131m.\u00a0 Daha \u00f6nce olu\u015fturmu\u015f oldu\u011fum\u00a0\u00a0<strong>IgnoreCopy<\/strong> adl\u0131 attribute class&#8217;\u0131ma Attributes klas\u00f6r\u00fc\u00a0 i\u00e7erisine yer verdim.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Proccesses\u00a0<\/strong>class&#8217;\u0131m\u0131n i\u00e7erisine\u00a0<strong>Static\u00a0<\/strong>olarak\u00a0<strong>Copier<\/strong> ad\u0131nda class olu\u015fturdum. \u0130ki farkl\u0131 \u015fekilde kullan\u0131labilmesi i\u00e7in iki farkl\u0131 metodu a\u015fa\u011f\u0131daki gibi bu class i\u00e7erisine yazd\u0131m.<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><div class=\"csharp codecolorer\"><span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">class<\/span> Copier<br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> T Copy<span class=\"sy0\">&lt;<\/span> T <span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#40;<\/span>T <span class=\"kw1\">from<\/span>, T to<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> property <span class=\"kw1\">in<\/span> <span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>T<span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GetProperties<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>property<span class=\"sy0\">.<\/span><span class=\"me1\">GetCustomAttributes<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>IgnoreCopy<span class=\"br0\">&#41;<\/span>, <span class=\"kw1\">false<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Length<\/span> <span class=\"sy0\">&amp;<\/span>gt<span class=\"sy0\">;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> editedProp <span class=\"sy0\">=<\/span> property<span class=\"sy0\">.<\/span><span class=\"me1\">GetValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">from<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>editedProp <span class=\"sy0\">==<\/span> <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nproperty<span class=\"sy0\">.<\/span><span class=\"me1\">SetValue<\/span><span class=\"br0\">&#40;<\/span>to, property<span class=\"sy0\">.<\/span><span class=\"me1\">GetValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">from<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">return<\/span> to<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> CopyFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span> <span class=\"kw4\">object<\/span> to, <span class=\"kw4\">object<\/span> <span class=\"kw1\">from<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">var<\/span> property <span class=\"kw1\">in<\/span> to<span class=\"sy0\">.<\/span><span class=\"me1\">GetType<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">GetProperties<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>property<span class=\"sy0\">.<\/span><span class=\"me1\">GetCustomAttributes<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">typeof<\/span><span class=\"br0\">&#40;<\/span>IgnoreCopy<span class=\"br0\">&#41;<\/span>, <span class=\"kw1\">false<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Length<\/span> <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> editedProp <span class=\"sy0\">=<\/span> property<span class=\"sy0\">.<\/span><span class=\"me1\">GetValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">from<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>editedProp <span class=\"sy0\">==<\/span> <span class=\"kw1\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nproperty<span class=\"sy0\">.<\/span><span class=\"me1\">SetValue<\/span><span class=\"br0\">&#40;<\/span>to, property<span class=\"sy0\">.<\/span><span class=\"me1\">GetValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">from<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Bu \u015fekilde yaparak, ister static class&#8217;\u0131 referans edip t\u00fcm objelerde Extension method olarak kullan\u0131lmas\u0131n\u0131 sa\u011flayabilirim veya Copy metodum ile do\u011frudan copyalama i\u015flemimi ger\u00e7ekle\u015ftirebilirim. \u015eimdi gel gelelim bunu ba\u015fka bir projede kullanmaya. <strong>\u00a0ModelMixer_Debugger\u00a0<\/strong>ad\u0131nda bir proje daha a\u00e7t\u0131m (<em>Console Application<\/em>) ve bu Class Library projemizi Build edip, elde etmi\u015f oldu\u011fumuz dll&#8217;i Debugger&#8217;\u0131n referanslar\u0131na ekledik.<\/p>\n<p>Model olu\u015fturma. Elimizde zaten bir\u00a0<strong>User<\/strong> modeli vard\u0131. Bunu aynen kullanaca\u011f\u0131m (<strong><em>IgnoreCopy<\/em><\/strong><em> attribute&#8217;\u00fc ile birlikte<\/em>). Kopyalanmas\u0131n\u0131 istemedi\u011fim property&#8217;lere kesinlikle IgnoreCopy attribute&#8217;\u00fcn\u00fc koyal\u0131m.<\/p>\n<p><em>\u00d6rnek: Entity Framework Modellerinde ili\u015fkili tablodan \u00e7ekilen veriler gibi. E\u011fer d\u00fczenlenen verinizde o ili\u015fki tablosundaki veriler yoksa SaveChanges yapt\u0131\u011f\u0131n\u0131zda ili\u015fkiyi koparm\u0131\u015f ve veriyi silmi\u015f olabilir!<\/em><\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"csharp codecolorer\"><span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> Main<span class=\"br0\">&#40;<\/span><span class=\"kw4\">string<\/span><span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span> args<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\nUser originalUser <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> User <span class=\"br0\">&#123;<\/span> ID <span class=\"sy0\">=<\/span> Guid<span class=\"sy0\">.<\/span><span class=\"me1\">NewGuid<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>, Name <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ali&quot;<\/span>, Surname <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Ahmet&quot;<\/span>, BirthDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddYears<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">26<\/span><span class=\"br0\">&#41;<\/span>, RegisterDate <span class=\"sy0\">=<\/span> DateTime<span class=\"sy0\">.<\/span><span class=\"me1\">Now<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">AddDays<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">-<\/span><span class=\"nu0\">5<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\nUser editedUser <span class=\"sy0\">=<\/span> <span class=\"kw3\">new<\/span> User <span class=\"br0\">&#123;<\/span> Name <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Aliahmet&quot;<\/span>, Surname <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Mehmeto\u011flu&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/do\u011frudan bu \u015fekilde kullanabiliriz<\/span><br \/>\nCopier<span class=\"sy0\">.<\/span><span class=\"me1\">Copy<\/span><span class=\"br0\">&#40;<\/span>editedUser, originalUser<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/veya ihtiyac\u0131m\u0131z olabilme ihtimaline kar\u015f\u0131 koymu\u015f oldu\u011funuz casting i\u015flemini uygulayarak da kullanabiliriz<\/span><br \/>\nCopier<span class=\"sy0\">.<\/span><span class=\"me1\">Copy<\/span><span class=\"sy0\">&lt;<\/span>User<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#40;<\/span>editedUser, originalUser<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/veya static class'\u0131n namespace'ini using olarak ekledikten sonra;<\/span><br \/>\noriginalUser<span class=\"sy0\">.<\/span><span class=\"me1\">CopyFrom<\/span><span class=\"br0\">&#40;<\/span>editedUser<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nConsole<span class=\"sy0\">.<\/span><span class=\"me1\">ReadLine<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>&nbsp;<\/p>\n<p>Kullan\u0131m\u0131 olduk\u00e7a kolay hale getirdik. Art\u0131k her ihtiyac\u0131m\u0131z oldu\u011funda tekrar tekrar foreach yaz\u0131p if kontrolleri yap\u0131p uzun uzun u\u011fra\u015fmayaca\u011f\u0131z. Bu en basit halidir. \u0130stedi\u011finiz gibi Custom Attribute&#8217;ler yaz\u0131p bu attribute&#8217;lere g\u00f6re her property i\u00e7ni farkl\u0131 davranmas\u0131n\u0131 sa\u011flayabilirsiniz. \u00dczerinde kullanaca\u011f\u0131m\u0131z modellere bu attribute&#8217;leri eklemek gerekiyor sadece. Onun d\u0131\u015f\u0131nda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi kullan\u0131m\u0131n\u0131 en kolay hale getirdik.<\/p>\n<p>&nbsp;<\/p>\n<p>Projenin \u00f6rne\u011fine <a href=\"https:\/\/github.com\/enisn\/ModelMixer\">buradan<\/a> ula\u015fabilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Ba\u015fl\u0131k asl\u0131nda bu i\u00e7eri\u011fi tam anlam\u0131yla anlatm\u0131yor. Fakat b\u00f6yle bir \u015feyi google&#8217;da arayacak olsayd\u0131m buna benzer bir \u015fey yazard\u0131m herhalde. Bug\u00fcn de\u011finmek istedi\u011fim konu, bana birden fazla kez sorulan bir \u015fey asl\u0131nda. \u00d6nce \u00e7\u00f6zmek istedi\u011fimiz sorundan bahsedelim. \u0130kinci olarak bunu nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 yapal\u0131m yani sorunu \u00e7\u00f6zelim. \u00dc\u00e7\u00fcnc\u00fc a\u015famada ise de bunu di\u011fer projelerimizde direk kullanabilece\u011fimiz \u015fekle \u00e7evirip dll almay\u0131 yapal\u0131m. Sorunsal Diyelim ki elimizde i\u00e7inde property&#8217;leri olan C# class&#8217;\u0131 var. Birisi veritaban\u0131m\u0131zdan gelen bir instance ve di\u011feri de kullan\u0131c\u0131 taraf\u0131ndan d\u00fczenlenmi\u015f olan instance. \u0130stedi\u011fim \u015fey ise k\u0131sa yoldan d\u00fczenlenmi\u015f class&#8217;dakileri orjinal class&#8217;a aktarma. Fakat do\u011frudan d\u00fczenlenmi\u015fi orjinale atayam\u0131yorum \u00e7\u00fcnk\u00fc d\u00fczenlenmi\u015fte null alanlar var veya de\u011fi\u015ftirmek istemedi\u011fim alanlar var. Bunu do\u011frudan uzun yoldan \u015fu \u015fekilde yapabilirim. \u00d6nce class\u0131m: &nbsp;public class User &#123; public Guid ID &#123; get; set; &#125; public string Name &#123; get; set; &#125; public string Surname &#123; get; set; &#125; public DateTime BirthDate &#123; get; set; &#125; public string PasswordHash &#123; get; set; &#125; public DateTime RegisterDate &#123; get; set; &#125; &#125; Uzun uzun yapaca\u011f\u0131m i\u015flem: \/\/Bu \u00fczerinde de\u011fi\u015fiklik yapmak istedi\u011fim instance User orignalUser = new User &#123; ID = Guid.NewGuid&#40;&#41;, BirthDate = DateTime.Now.AddYears&#40;-25&#41;, Name = &quot;Ahmet&quot;, Surname = &quot;Ahmeto\u011flu&quot; &#125;; \/\/Bu da kullan\u0131c\u0131 taraf\u0131ndan de\u011fi\u015fiklik yap\u0131lm\u0131\u015f model User editedUser = new User &#123; ID = orignalUser.ID, Name = &quot;Ahmet&quot;, Surname = &quot;Y\u0131lmaz&quot;, BirthDate = DateTime.Now.AddYears&#40;-26&#41; &#125;; \/\/editedUser&#8217;da birden fazla null alan var. ve di\u011ferinden farkl\u0131 olan alanlar da var. \/\/Bunu originalUser de\u011fi\u015fkenine aktarmak i\u00e7in \u015funu yapabilirim. orignalUser.Name = editedUser.Name; orignalUser.Surname = editedUser.Surname; orignalUser.BirthDate = editedUser.BirthDate; \/\/&#8230; \/\/Gibi t\u00fcm de\u011fi\u015ftirmek istedi\u011fim property&#8217;lerin atamas\u0131n\u0131 elle yapabilirim. Fakat istemi\u015f oldu\u011fum \u015fey, editedUser&#8217;daki null olmayan alanlar\u0131 de\u011fi\u015ftiren ve ID gibi de\u011fi\u015fmesin istemedi\u011fim alanlar\u0131 de\u011fi\u015ftirmeyen bir algoritmaya ihtiyac\u0131m olacak. \u015eu \u00f6rnekte \u00e7ok b\u00fcy\u00fck bir s\u0131k\u0131nt\u0131 yok fakat \u00e7ok say\u0131da property&#8217;den olu\u015fan modellerimizde b\u00f6yle bir yol izlemek tamamen amelelikten ba\u015fka bir \u015fey olmayacakt\u0131r. Basit \u00c7\u00f6z\u00fcm \u0130lk akla gelen \u015fey ise bir d\u00f6ng\u00fc; Mesela foreach&#8230; Benim User class&#8217;\u0131m\u0131n i\u00e7indeki property&#8217;leri teker teker d\u00f6n\u00fcp bir instance&#8217;dan al\u0131p di\u011fer instance&#8217;a aktarmak istiyorum. Bunu ise System&#8217;den gelen\u00a0Type class&#8217;\u0131n\u0131n bir metodu olan\u00a0GetProperties()\u00a0metodu ile yapaca\u011f\u0131m. kullan\u0131m\u0131 \u015fu \u015fekilde: \/\/Bu \u00fczerinde de\u011fi\u015fiklik yapmak istedi\u011fim instance User orignalUser = new User &#123; ID = Guid.NewGuid&#40;&#41;, BirthDate = DateTime.Now.AddYears&#40;-25&#41;, Name = &quot;Ahmet&quot;, Surname = &quot;Ahmeto\u011flu&quot; &#125;; \/\/Bu da kullan\u0131c\u0131 taraf\u0131ndan de\u011fi\u015fiklik yap\u0131lm\u0131\u015f model User editedUser = new User &#123; ID = orignalUser.ID, Name = &quot;Ahmet&quot;, Surname = &quot;Y\u0131lmaz&quot;, BirthDate = DateTime.Now.AddYears&#40;-26&#41; &#125;; \/\/ Herhangi bir kontrol olmadan \u015fu \u015fekilde editedUser&#8217;\u0131 originalUser&#8217;a \u015fu ","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[20,6],"tags":[],"_links":{"self":[{"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/posts\/672"}],"collection":[{"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/comments?post=672"}],"version-history":[{"count":22,"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/posts\/672\/revisions"}],"predecessor-version":[{"id":696,"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/posts\/672\/revisions\/696"}],"wp:attachment":[{"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/media?parent=672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/categories?post=672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/enisnecipoglu.com\/en\/wp-json\/wp\/v2\/tags?post=672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}