I want to add more functionality to a project I have that makes use a number of classes packaged in the NET Framework. These same classes provide a number of properties which can be quite useful adapting the functionality of my project, however one thing that these classes lack is Events.
If each property had a appropriate event that would fire whenever the value of such property changed, I could then assign a event handler that would act based on those properties value.
I made a sample case bellow to illustrate my goal in the most simpler way I could think off.
Sample case:
The
System.Net.Sockets.Socketclass (Socket on MSDN Docs) has a property
namedConnectedthat basically returns true if the socket is
connected to a specified end point otherwise returns false.What I would like to accomplish is simple. I would like to keep this
property under “watch” and when the value of it changes, fire a event.
Doing that to one of my own classes it would be simple although a bit tiresome using the INotifyPropertyChanged interface, simply because always that my code changed the value of the property I would have to fire the event manually. Unfortunately, to best of my knowledge, not even this kind of procedure can be applied to the existing Socket class distributed within NET Framework.
Well, this question is becoming quite extensive, sorry, but I hope it gave an insight to my goal.
Now simply putting it, I want to watch the Connected property of the Socket class and when the value of it changes, fire an event. And if it would be possible to also use such approach to watch variables as well properties, it would be awesome, not just for me, but for everyone who stumbles across this question on SO.
A simple and lightweight approach is preferred of course, but most of all, I want to understand how it can be done, so in the future I can apply it in mass scale to other classes.
I realize I’m asking a lot. Many thanks.
Any questions just ask.
I implemented a basic class that should get you started. I’m sure a fully functional, production-ready, thread-safe class would require a bit more work, plus you need to implement your own strategy for when to poll for value changes.
And the event handling:
Usage looks something like this:
Notice the constructor takes a simple lambda expression that can evaluate the value you’re wanting to observe.
Also note that
MainThread.Invokeis just a pseudocode to show it polling for a change on every main thread loop. I’m sure there are nicer strategies (background thread with a timer interval) for example that could be implemented in a nice, reusable way. Still more work to be done in terms of deregistering the observer. Could probably make some nice factory methods or lambda delegates so you don’t need to keep the TargettedObserver instance floating around and reduce the amount of wiring/manual code. But at least this should be a start.