Handling IDisposable Objects in a Generic List

I wanted to have more precise control over the lifetime of objects I was keeping in a list rather than wait for the GC. I came up with the code below which adds a few extension methods for handling IDisposable objects in a generic list. This was more elegant than adding a helper class.

I only implemented what I needed for the current project but these are very straightforward to do.

Sample code below.

using System;
using System.Collections.Generic;

namespace MyExtensions
{
    public static class Extensions
    {
        /// Remove tail, starting at index.
        public static void RemoveTail<T>(this List<T> list, int index)
        {
            if (index >= list.Count) { return; }

            if (typeof(IDisposable).IsAssignableFrom(typeof(T)))
            {
                List<T> temp = list.GetRange(index, list.Count - index);
                ClearAndDispose(temp);
            }
            list.RemoveRange(index, list.Count - index);
        }
        public static void ClearAndDispose<T>(this List<T> list)
        {
            if (typeof(IDisposable).IsAssignableFrom(typeof(T)))
            {
                foreach (T obj in list)
                {
                    IDisposable iFace = (IDisposable)obj;
                    iFace.Dispose();
                }
            }
            list.Clear();
        }
    } //*** Extensions
} //*** namespace

Usage is simple.

using MyExtensions;
...

var myList = new List<HugeObject>();
...

myList.RemoveTail(idx);
...

myList.ClearAndDispose();

Escher Version 0.2

Escher Version 0.2 is up.

This version fixes the flicker issue, adds undo, fill/no-fill enclosed shapes, and drawing crosshairs.

Escher is a free, fun multi-shape drawing program for doodling, like a cross between MSPaint and a kaleidoscope.

More details here:  http://www.georgepotts.com/apps/escher/

Example:
FlyingTriangles