Вместо сохранения «операции, которая должна быть выполнена» в виде пары методов и аргумента, который должен быть передан ей с помощью Reflection, вы можете сохранить делегат, который должен быть выполнен. Самый простой способ сделать это - сохранить список типа List<Action<Customer>>
- затем в методе ApplyChanges
вы можете выполнить итерацию по списку и выполнить все действия.
Если вы не используете .NET 3.5 и C # 3.0 (который определяет универсальный делегат Action
и поддерживает лямбда-выражения), вы все равно можете написать это в C # 2.0:
// you can define a delegate like this
delegate void UpdateCustomer(Customer c);
// and you could use anonymous methods
// (instead of more recent lambda expressions)
list.Add(delegate (Customer c) { c.SetName("test"); });
РЕДАКТИРОВАТЬ: похоже, я медленнее писал код, но я оставлю это здесь в качестве объяснения - решение с помощью 'dtb' делает именно то, что я описал.