2009-04-24 7 views
0

J'ai une collection IEnumerable<IDisposable> dont je dois disposer à un moment donné. Le problème est que, dans certains cas, tout l'objet sera d'un type et que l'élimination des objets doit être effectuée en collectant des données auprès d'eux et en effectuant un seul appel RPC. Dans d'autres cas, les objets seront d'un autre type et j'ai juste besoin d'appeler Dispose sur chacun d'entre eux.comment mettre en place un IEnumerable <IDisposable>

Je contrôle le code en faisant cela mais je préfère ne pas y insérer de détails d'implémentation.

Si je dois je peux passer à quelque chose comme ça, mais il semble inélégant.

with(var rpc = new RPCDisposer()) 
{ 
    foreach (var item in Items) 
    { 
     rpc.Add(item); 
     item.Dispose(); 
    } 
} 

Edit: la liste (pour l'instant) ne contiendra que l'un ou l'autre type, jamais les deux. Mais je préfère le code Éliminez pas à connu sur la substance RPC du tout, ei:

foreach (var item in Items) 
    item.Dispose(); 
+0

Ce que vous avez posté est vraiment pas si mal une solution. Je pense que vous cherchez quelque chose qui n'est tout simplement pas là, pour être honnête. Aller avec votre solution initiale et éventuellement utiliser LINQ pour le simplifier, mais c'est tout. – Noldorin

+0

Je m'attendais à moitié, mais j'espérais juste quelque chose de mieux. – BCS

Répondre

3

Si cela dépend du type d'élément alors que vous pourriez faire un contrôle sur quel genre d'élément que vous avez, en ajoutant à RPCDisposer uniquement ceux de ce type spécifique.

using(var rpc = new RPCDisposer()) 
{ 
    foreach (var item in Items) 
    { 
     if (item is RPCItemType) 
      rpc.Add(item); 
     item.Dispose(); 
    } 
} 

Mais mieux encore, si vous n'avez pas mélangé ces objets dans la même liste. Pourriez-vous refactoriser votre code pour les garder dans deux listes différentes?

+0

OTOH à un moment donné je vais avoir un sac mélangé (et avoir besoin d'exécuter plusieurs RPC, un par système distant) donc je pourrais avoir besoin de mordre la balle et supposer que le code a besoin de trier les éléments. – BCS

1

La méthode OfType peut vous aider à séparer les éléments en deux listes ...

var rpcItems = items.OfType<RPCItemType>();  
var normalItems = items.Where(x => !rpcItems.Contains(x)); 
Questions connexes