Повторное использование объекта не работает должным образом - PullRequest
2 голосов
/ 23 марта 2010

Я повторно использую созданный Объект только для того, чтобы изменить дату и порядковое значение, но в конце я получаю 6 объектов точно так же, как последний.

другими словами, я добавляю объект как Ссылка , и я должен добавить как Значение

Что мне наследовать, чтобы у моего объекта был метод Copy()?

RecurringPayment rp, copy;

rp = new RecurringPayment
{
    ...
}
payments.Add(rp);  // add first object

copy = rp;  // Copy the original element
for (int i = 1; i <= 5; i++)
{
    copy.NextPaymentDate = copy.NextPaymentDate.AddDays(copy.RecurringTime * 7);
    copy.OrderOrdinal = copy.OrderOrdinal + 1;

    payments.Add(copy); // add 5 more with X weeks ahead
}

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 марта 2010

Вы можете реализовать ICloneable, а затем вызвать clone, чтобы получить поверхностную копию вашего объекта!

Вы можете реализовать так, если хотите (возможно, есть лучшие способы):

public object Clone()
{
    return MemberwiseClone();
}
2 голосов
/ 23 марта 2010

Вы не получите 6 объектов . В итоге вы получите 6 ссылок , каждая из которых ссылается на один и тот же объект .

Вы могли бы реализовать ICloneable и позвонить Object.MemberwiseClone - но я не уверен, что смогу. Вместо этого я хотел бы попытаться сделать RecurringPayment неизменным для начала и добавить метод WithNextPaymentDate(DateTime nextDate) или что-то подобное, который создает новый объект с заданными значениями. Ваш код будет выглядеть примерно так:

// Can't use object initializers on immutable types of course - all the
// values would have to be specified in the constructor call
RecurringPayment payment = new RecurringPayment(...);
payments.Add(payment);

for (int i = 1; i <= 5; i++)
{
    // This would automatically increment the OrderOrdinal in the newly
    // created object
    payment = payment.WithNextPaymentDate(payment.RecurringTime * 7);
    payments.Add(payment);
}
...