obiect nou în buclă

Mă înfurii cu acest cod de cod:

for (int h = 0; h < invocations; h++)
{
    Filter newFilter = new Filter();
    newFilter = customFilter;
    newFilter.DateFrom = customFilter.DateFrom.AddDays(h*8);
    newFilter.DateTo = newFilter.DateTo.AddDays(8).AddSeconds(-1);

customFilter is an object of type Filter customFilter is as an object which has about 10 properties inside it correctly filled. I need to create a new object but I've to change just two of these 10: DateFrom and DateTo. The problem is that after the assignment of newFilter.DateFrom and newFilter.DateTo, also the customFilter.DateFrom and customFilter.DateTo change. Could someone help me?

Pa M.

0
Ok, mulțumesc pentru explicație. Ai putea să mă ajuți cum să scapi de această problemă?
adăugat autor matan, sursa
customFilter este obiect. Prin urmare, aici se fac referințe
adăugat autor Nikhil Agrawal, sursa

5 răspunsuri

newFilter simply a variable. I'm assuming Filter is a class; in which case, when you do this:

Filter newFilter = new Filter();
newFilter = customFilter;

puteți uita </​​strong> în legătură cu codul Filtru - tocmai ați renunțat undeva pe podea, fiind inaccesibil din afară: ați setat newFilter < pentru a fi o referință la obiectul existent , prin intermediul codului de referință existent customFilter .

newFilter and customFilter are now references to the same object.

Bănuiesc că trebuie să elimini linia:

newFilter = customFilter;

lăsând doar:

Filter newFilter = new Filter();
// set all properties on newFilter

sau face clonabil:

Filter newFilter = customFilter.Clone();
// set just the properties that need changing on newFilter
0
adăugat

Problema este că faceți o referință la customFilter, cu noul dvs. filtru în linia 4

0
adăugat

Eliminați linia newFilter = customFilter; și copiați fiecare proprietate manual.

Linia de mai sus copiază referința în customFilter la variabila newFilter , înlocuind noul filtru pe care tocmai l-ați creat. newFilter și customFilter indică exact același obiect după această operație.

0
adăugat
Ar trebui să fie o idee pentru că sunt "numai" 10 proprietăți. Dar, ipotetic, există o altă modalitate de ao rezolva în cazul în care obiectul este mai complex?
adăugat autor matan, sursa
Ați putea folosi reflecția pentru a copia proprietățile sau pentru a utiliza un instrument ca automapperul care face acest lucru pentru dvs.
adăugat autor Albin Sunnanbo, sursa

Prin atribuirea:

newFilter = customFilter;

cele două referințe newFilter și customFilter indică același obiect!

0
adăugat

Nu copiați proprietățile customFilter, atribuieți newFilter o referință la același obiect ca și customFilter (presupunând că ați declarat Filter ca class )).

Ați putea crea un constructor de copii și creați obiectul de la acesta:

public Filter(Filter template) {
    this.Prop1 = template.Prop1;
    this.Prop2 = template.Prop2;
   //etc.
}

apoi folosiți-l astfel:

Filter newFilter = new Filter(customFilter);

Sau puteți oferi o metodă Clone() în clasa Filter care returnează o clonă:

public Filter Clone() {
    Filter result = new Filter();
    result.Prop1 = this.Prop1;
    result.Prop2 = this.Prop2;
   //etc.
    return result;
}

Ar putea fi folosit astfel:

Filter newFilter = customFilter.Clone();
0
adăugat