Diskuze: C# kopírování modelu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 22 zpráv z 22.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ak som dobre rozumel tvojej otázke, tak chceš, aby sa rovnakým spôsobom spravila deep copy aj vlastností ďalších objektov, ktoré sú v tých vlastnostiach? (napr. zavolám CopyPropertyValuesTo na objekte typu Trida1 a začne to kopírovať aj vlastnosti objektu O)
V tom prípade by ti malo stačiť vložiť podmienku v štýle if (!property.PropertyType.IsValueType) a v prípade jej splnenia zavolať rekurzívne tú tvoju metódu, nie?
Nehovorím, že je to dobré riešenie a odporúčal by som ti pozrieť sa na toto vlákno, ale malo by to robiť to, čo chceš.
To je deep copy, ale tohle je trošku něco jiného ne? Ono já jsem to
ještě trošku blbě nastínil... Může to být třeba typ JinyObjekt1 a
JinyObjekt2, ale mají stené property! Nebo prostě chci aby se překopírovali
stejné property. A ano máš
pravdu, ale já nevím jaké tam dát parametry při tom dalším volání... to
je vše co potřebuju
AutoMapper používám, ale tady je to trochu problém. Nemám stejný objekt A a B. Mam různé modely a chci prostě překopírovat pouze jejich hodnoty podle jména, popřípade atributu. A nějak jsem nenašel, jak tohle udělat u autommaperu, já ho používám, když mám model z ef a dávám si ho do svého. A nenašel jsem, jak to udělat v kódu za běhu, protože to musím všechno nakonfigurovat před spuštěním...
Chceš klonovat property dvou zcela různých objektů pouze na základě
shodného názvu a i případně typu vlastnosti?
Něco jako, projdu objektem 1 a hledám co property v objektu 2, a když je
jméno a případně typ je shodný tak provedu kopii (hodnot hodnotových
typů, tak i nových instancí typů podobjektů).
A pokud se tedy kopíruje podobjekt jako vlastnost, tak se opět hledá od
začátku a kopírují se z podobjektu poze shodné názvy/typy?
Pak by stačila obyčejná rekurze... mechanismus tvorby podobjektů by mohl byl
shodný s kořenovým způsobem vytvoření "kopie" objektu...uff.
Problém je snad jen v tom, že nikdy nevíš co vlastně vracíš a kopíruješ
pouze něco, co se stejně jmenuje a nejde ti o objektovou strukturu, ale pouze
o datový rámec kopírovaného složeného objektu.
Tím pádem mi přijde, že se porušují naprosto všechny pravidla
objektového programování. Můj skromný názor.
Ktera pravidla OOP by byla porusena? Mohl bys to vice rozvezt?
Chápu jak to myslíš, ale tohle je věc kterou budu používat opravdu jen ve vyjmečných situací. Jde o to, že například jeden objekt bude mít více vlastností a druhý jenom 2, zde nejspíše nemůžu použít autommaper, protože objekty nejsou totožné, tohle je jenom moje doměnka, kdyžtak mě prosím opravte. No tak to muzu udělat způsobem
new Model() { ID = model.ID, Name = model.Name}
Když koukneš na net, tak je toho spousta a jde opravdu jen o usnadněnía používat to budu zřítka, takze sem to chtěl použíz. A napadlo mě, že by bylo fajn i kdyby to umělo rekurzivně, samozřejme to funguje i bez toho, takze si nad tím podojbektem zavolám stejnou metodu
No bud si to budes mapovat sam a nebo treba posli priklady trid, ktere jsou
rozdilne a chces je mapovat. Treba to jde, akorat narazis na neznalost
automapperu.
Ok...Nejde o pravidla - každý si je porušuje podle svého a podle potřeby
- jde o filosofii. Tak třeba už jen z podstaty věci, že se pracuje s
něčím, co má být uceleným popisem "logické" struktury, a má se s ní
podle nějakých pravidel pracovat a přelévat se do jiných "logických"
struktur, se najednou dá pracovat "bez logiky", jen na základě něčeho tak
vágního, jako že se něco stejně jmenuje...
Jinak, než bez kontroly typu (a nebo jiných vlastností properties), si
nedovedu představit, že by to kdy fungovalo jinak, než jen jako potenciální
generátor chyb.
Vidím už problém jenom v tom, že u některých vystavených read-only
properties, které nastavuje nějaká objektová logika tu hodnotu
nezkopírujete nikdy "dokonale" (záleží co to vnitřně řeší)... zjeména
pokud jde o dva různé objekty mající jen stejně pojmenovanou vlastnost,
které mohou být svým implementovaným významem v každém z objektů na hony
si vzdálené. Jen názor.
Příjde mi to jako velmi špatný návyk... pokud něco takového řešíš tak bych řekl, že máš špatně navrženou architekturu aplikace...
Nicméně asi by to šlo přes reflexi. Momentálně nejsem doma, ale odpoledne až budu mít čas se ti můžu pokusit napsat nějakou extension funkci, která by zkopírovala vlastnosti z jednoho objektu do druhého.
Určitě se ale zamysli ještě jednou nad OOP návrhem tvé aplikace. Tyhle věci jsou většinou znak špatného návrhu.
vajkuba1234:
Dobře příklad třídy
Model1:
public int ID { get; set; }
public string Name { get; set; }
public string Descrtiption { get; set; }
public string ID_AdvertisementState { get; set; }
public int ID_Category { get; set; }
public string ID_AdvertisementType { get; set; }
public System.DateTime DateCreate { get; set; }
public string DealerPhone { get; set; }
public string DealerName { get; set; }
public string DealerEmail { get; set; }
public Nullable<decimal> Price { get; set; }
public string DealerFacebook { get; set; }
public bool IsDealerEmailShow { get; set; }
public bool IsDealerPhoneShow { get; set; }
public bool IsPriceDeal { get; set; }
public bool IsActive { get; set; }
public string Password { get; set; }
public int ID_Village { get; set; }
public System.Guid VerifyKey { get; set; }
public bool IsVerify { get; set; }
public int ID_Dealer { get; set; }
public virtual AdvertisementState AdvertisementState { get; set; }
public virtual AdvertisementType AdvertisementType { get; set; }
public virtual Category Category { get; set; }
public virtual ICollection<ImageAdvertisement> Images { get; set; }
public virtual Village Village { get; set; }
Model2:
public string Name { get; set; }
public string ID_AdvertisementState { get; set; }
public int ID_Category { get; set; }
public string ID_AdvertisementType { get; set; }
public IEnumerable<int> Images { get; set; }
public Int32? ID { get; set; }
Možná to tim automapperem de, ale možná kvůli mé neznalosti to nejde...
martin.svoboda,Samuel Kodytek
Já zcela dobře nechápu co je na tom špatného Jde mi jenom o to, že nechci
psát
Model m1 = new Model() {
x.ID = m2.ID,
x.Name = m2.Name
}
Ale jenom m1.CopyPropertyValues(m2);
Vím jaké tam mám vlastnosti, neměl by to být problém... A de mi taky o to,
že nevím, proč bych měl mít špatný návrh... Když tak se omlouvám,
jenom mi to není jasné a je to i dost diskutované, je to jenom takový
ulehčení, které sebou nenese moc problémů a navíc tam mam atribut pokud se
jména liší
https://stackoverflow.com/…with-c-sharp
https://www.pluralsight.com/…g-reflection
Autommaper funguje na podobný způsob
Automapper sa dá nakonfigurovať tak, aby ti pri mapovaní z jedného typu na druhý určité vlastnosti ignoroval (https://stackoverflow.com/…tial-mapping).
Možno by som ti ešte navrhol alternatívne riešenie - ValueInjecter,
najmä jeho metódu InjectFrom.
https://github.com/…alueInjecter
https://stackoverflow.com/…alueinjecter
Pokiaľ by si sa rozhodol použiť ten Automapper, tak čo sa týka mapovania vnorených objektov, toto mi možno trochu pomôže: https://stackoverflow.com/…ts-using-aut
I mean, je super, ak si tú funkcionalitu vieš napísať pomocou reflexie sám, ale pokiaľ to náhodou potrebuješ v práci, tak tam nemáš veľmi priestor na to vymýšľať znovu koleso. Ak je k dispozícii hotové riešenie, ktoré poskytuje viac funkcionality, je poriadne otestované, odladené a udržiavané niekým iným, tak nemá veľmi zmysel snažiť sa spraviť to isté na kolene. A takmer vždy je rýchlejšie stráviť pol hodinu nad dokumentáciou a Stack Overflow, aby som si doplnil medzery v znalostiach, než stráviť hodiny písaním vlastného ad hoc kódu od brucha.
Co ja vim, tak pri mapovani z jednoho modelu na druhy, i pri rozdilnem poctu properties, Automapper namapuje property se stejnym jmenem. Proste to umi.
Jak je to s vnorenymi objekty nevim, ale mapping z Modelu na Viewmodel a naopak je uplne normalni vec - navic viewmodel nutne nemusi korespondovat s modelem 1:1...
Ty modely co jsi poslal jsou tve vlastni vytvory?
Jsem to ale blbec.... V tom autommaperu jsem měl jiný problém a myslel
jsem, že mi to nefunguje kvůli tomuhle... Nicméně díky autommaper to
normálně umí Takže se moc
omlouvám, ale i tak moc děkuji za rady. A ještě jeden rychlý dotaz,
existuje u autommaperu například nějaký atribut, aby to neporovnával pouze
podle názvu? Například mám v jednom modelu Cislo1 a v druhém Cislo2 a
chtěl bych aby mi to autommaper spojil. Jde to nějak v configu autmmaperu nebo
přes ten atribut? Díky
https://automapper.readthedocs.io/en/latest/Custom-value-resolvers.html
Tady je spravny link
https://automapper.readthedocs.io/en/latest/Projection.html
Tady je vnorene mapovani
https://automapper.readthedocs.io/en/latest/Nested-mappings.html
Hlavne, ono by stacilo kouknout na google, dokumentaci a nebo treba na Github
Omlouvám se, byl jsem teď mimo PC. Určitě! Strašně moc děkuju. Jsem blbec... A na to mapování
ano vím, že můžu požít googlu, ale rovnou jsem se zeptal, když tu byl
člověk co tomu rozumí. Ještě jednou díky moc
Zobrazeno 22 zpráv z 22.