.NET имеет ObservableCollection<T>
, но он используется для наблюдения за изменениями, происходящими с сохраненными объектами и самой коллекцией. Ваша коллекция не меняется (учитывая, что я вас правильно понял) - вы просто хотите получать уведомления во время цикла, если какое-либо значение свойства отличается от того, которое было в предыдущей итерации.
Что-то, что может указать вам правильное направление с точки зрения наличия кода многократного использования:
public class PropertyWatcher<TSource>
{
// initialization code omitted
private Dictionary<string, object> previousValues;
private Dictionary<string, Func<TSource, object>> selectors;
public void RegisterWatcher<TSource>(Func<TSource, object> propertySelector,
string propertyName)
{
this.selectors.Add(propertyName, propertySelector);
this.previousValues.Add(propertyName, null);
}
public void NotifyIfDifferent<TObject, TPropertyType>(TSource currentItem)
{
foreach (var key in this.selectors.Keys)
{
var selector = this.selectors[key];
var currentValue = selector(currentItem);
if (!currentValue.Equals(this.previousValues[key]))
{
// raise notification, event; antyhing to your liking
}
this.previousValues[key] = currentValue;
}
}
}
И, предполагая, что мы имеем дело с P1
и P2
свойствами, которые вы упомянули, использование будет выглядеть следующим образом:
var list = new List<SomeObject>(); // list of items you intend to watch
var watcher = new PropertyWatcher<SomeObject>();
watcher.RegisterWatcher((SomeObject o) => o.P1, "P1");
watcher.RegisterWatcher((SomeObject o) => o.P2, "P2");
foreach (var item in list)
{
watcher.NotifyIfDifferent(item);
}
Это далеко не полное решение. Он должен работать, когда речь идет о простых значениях (поэтому .Equals
может легко выполнять сравнение). Конечно, вам все равно нужно добавить какое-то событие в класс PropertyWatcher
и, возможно, настроить его здесь и там - но я думаю, что общую идею довольно легко понять.
Хотя для более сложных сценариев, я полагаю, вам придется работать с более общим подходом.