c# – 有没有办法使用动态创建目标的using语句?

假设我已经定义了一个Mydisposable类:Idisposable.我知道我可以在 using声明中提供一个硬编码的 IDisposable对象列表:
using (Mydisposable firstdisposable = new Mydisposable(),seconddisposable = new Mydisposable())
{
    // do something
}

现在假设我有几个方法对我的一次性对象集合执行操作,我想在using语句中执行此操作.它可能看起来像这样(但是这当然不起作用,因为using块需要一个或多个Idisposable对象并且我传递一个集合对象):

using (var mydisposables = GetMydisposables())
{
    foreach (var mydisposable in mydisposables)
    {
        DoSomething(mydisposable);
        DoSomethingElse(mydisposable);
    }
}

为清楚起见,其他方法如下:

static List<Mydisposable> GetMydisposables()
{
    throw new NotImplementedException(); // return a list of Mydisposable objects
}

static void DoSomething(Mydisposable withMydisposable)
{
    // something
}

static void DoSomethingElse(Mydisposable withMydisposable)
{
    // something else
}

有什么方法可以用using语句完成这个吗?或者我是否必须抛弃语句并手动处理?

解决方法

您可以采取的一种方法是创建Idisposable对象的集合,这也是Idisposable:
class CollectionOfdisposable<T> : Idisposable where T : Idisposable  {
    public IList<T> Members {get; private set;}
    public CollectionOfdisposable(IEnumerable<T> members) {
        Members = members.ToList();
    }
    public void dispose() {
        var exceptions = new List<Exception>();
        foreach (var item in Members) {
            try {
                item.dispose();
            } catch (Exception e) {
                exceptions.Add(e);
            }
        }
        if (exceptions.Count != 0) {
            throw new AggregateException(exceptions);
        }
    }
}

现在你可以这样写:

using (var mydisposables = GetMydisposables()) {
    foreach (var mydisposable in mydisposables.Members) {
        DoSomething(mydisposable);
        DoSomethingElse(mydisposable);
    }
}

static CollectionOfdisposable<Mydisposable> GetMydisposables() {
    throw new NotImplementedException(); // return a list of Mydisposable objects
}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...