试试这个:
public static void Dispose<T>(this List<T> list) where T : IDisposable {
for (int i = 0, il = list.Count; i < il; i++) {
list[i].Dispose();
}
list.Clear();
}
快速的解释:一个List<Bitmap>
是位图列表,而不是一个列表的IDisposables即使位图本身是一个IDisposable接口。然而,位图列表是T或更精确的列表:其中T实现IDisposable的T列表。所以编译器很高兴地接受上面的扩展方法。
此外(只是因为这使得这样的很好的例子):
List<T>
被说成是不随关于其类型参数。因此,下面的赋值是不允许的,就会产生一个编译错误:
List<IDisposable> l = new List<Bitmap>();
和既不是以下类型的转换:
List<Bitmap> lb = new List<Bitmap>();
List<IDisposable> ld = (List<IDisposable>)lb;
如果你在.NET 4然而(其中的类型参数方差被介绍),并使用一个通用的类型与协变类型参数(如IEnumerable<out T>
)以下类型转换成为有效的:
List<Bitmap> lb = new List<Bitmap>();
IEnumerable<IDisposable> ld = lb;
和是确实为你做了含蓄的事情。在这种情况下,下面的扩展方法也工作:
// In a static class:
public static void Dispose(this IEnumerable<IDisposable> e) {
foreach(var x in e) {
x.Dispose();
}
}
// Somewhere else:
List<Bitmap> l = new List<Bitmap>();
l.Dispose();
太棒了!这完美的作品! – 2013-02-26 06:50:47