public void GenericMethods()
        {
            var disposer = CreateDisposer <ImplementsIDisposable>();                                 //It simplifies Disposer creation
            var implementsIDisposable = new ImplementsIDisposable();
            var disposeSucceded       = disposer != null && disposer.Dispose(implementsIDisposable); //You can use Disposer as in the previous method

            Assert.IsTrue(disposeSucceded);
        }
        public void GenericReflection()
        {
            var disposer = CreateDisposer(typeof(ImplementsIDisposable)) as Disposer <ImplementsIDisposable>; //You can specify at runtime the Generic Type you want to create
            var implementsIDisposable = new ImplementsIDisposable();
            var disposeSucceded       = disposer != null && disposer.Dispose(implementsIDisposable);          //You can use Disposer as in the previous method

            Assert.IsTrue(disposeSucceded);
        }
        public void GenericConstrains()
        {
            //Open generic Type Parameters
            var disposer = new Disposer <ImplementsIDisposable>(); //Disposer will only accept Types which implement IDisposable
            var implementsIDisposable = new ImplementsIDisposable();
            var disposeSucceded       = disposer.Dispose(implementsIDisposable);

            Assert.IsTrue(disposeSucceded);
        }