observer pattern implementation in c#