This is another one in the series "heck, I never thought of that"... Like most of these articles, if you already knew this trick, ignore me...
Let's say you have a generic class with a new() constraint on the type parameter. This means that you are allowed to create new objects of the generic type, like this:
class GenericClass<T> where T:new() { public void SomeMethod() { T obj = new T(); ... } }
Pretty straightforward stuff, BUT there is a possibility that type T implements IDisposable, meaning that you should clean up after using any object of type T (using the Dispose method or a "using" block.
The trivial way of solving this problem is:
class GenericClass<T> where T:new() { public void SomeMethod() { T obj = new T(); ... if (obj is IDisposable) ((IDisposable) obj).Dispose(); } }
Not too bad, but we can do better:
class GenericClass<T> where T:new() { public void SomeMethod() { T obj = new T(); using (obj as IDisposable) { ... } } }
Pretty neat, don't you think? What actually happens is that the using block creates a "hidden" variable of type "IDisposable" and will call Dispose() on it when exiting the scope of the using block. If T does not implement IDisposable, the hidden variable will be null, and the compiler will not try to call Dispose().