2016-06-29 11 views
6

私はクラスMyDisposable : IDisposableを定義したとしましょう。私はusingステートメントにIDisposableオブジェクトのハードコーディングされたリストを提供することができます知っている:動的に作成されたターゲットでusingステートメントを使用する方法はありますか?

using (MyDisposable firstDisposable = new MyDisposable(), 
    secondDisposable = new MyDisposable()) 
{ 
    // do something 
} 

今度は、私は私の使い捨てのオブジェクトのコレクションに対して操作を実行するいくつかのメソッドを持っているとしましょう、と私はこれをしたいですusingステートメント内にあります。それは次のようになります(ただし、使用するブロックは、1つまたは複数の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ステートメントでこれを実現する方法はありますか?それとも、私はその声明を放棄して手動で処分しなければならないのですか?

+6

をあなたは 'DisposableCollection を作成することができます:IDisposable、IEnumerable ここでT:IDisposable' – Lee

+0

'MyDisposable'オブジェクトのコレクションをカプセル化し、その要素をすべて破棄する' IDisposable'を書くことができますそれを処分する。 –

+0

foreachブロック内にusingステートメントを追加してみませんか? – peinearydevelopment

答えて

7

一つのアプローチも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 
} 
+0

このクラスはFCLに存在するはずです。私はそれのような何かを見つけることができません。まあ、実際には、私はこれを見つけました['System.Reactive.Disposables.CompositeDisposable'](v = vs103)。https://msdn.microsoft.com/en-us/library/system.reactive.disposables.compositedisposable aspx)が必要ですが、これらの[Reactive extensions](https://msdn.microsoft.com/en-us/library/hh242985(v=103).aspx)が必要です。 –

3

IDisposableを実装する独自の型を作成し、そのコンストラクタ内に使い捨てオブジェクトのコレクションを受け入れ、それらを保持し、廃棄時にそれらをすべて破棄する必要があります。あなたが取ることができ

関連する問題