2009-04-17 7 views
2

Contexte:Existe-t-il un bon moyen de gérer automatiquement les conversions entre les tableaux et les collections fortement typées?

J'ai une grande solution où des centaines de fonctions prennent des collections fortement typées comme paramètres et les utilisent comme valeurs de retour.

La solution fait référence à un proxy généré qui convertit les appels en un service Web qui renvoie toujours la collection au format int [] ou Order [] ou au type wathever. Le proxy les enveloppe comme IntCollection ou OrderCollection.

Maintenant je veux référencer l'assemblage directement. Quand je fais cela, j'obtiens l'interface contre les tableaux au lieu des collections fortement typées générées par le proxy. Bien sûr, cela brise tout le code.

Je suis à la recherche d'une façon intelligente de gérer cela et d'éviter de réécrire des milliers de lignes de code.

Des idées?

Répondre

2

Ne IntCollection etc appartiennent à vous? Vous pouvez ajouter un opérateur de conversion implicite:

class IntCollection : Collection<int> { 
    public IntCollection() : base() { } 
    public IntCollection(IList<int> data) : base(data) { } 
    public static implicit operator int[](IntCollection items) { 
     return items.ToArray(); // LINQ, but can do manually 
    } 
    public static implicit operator IntCollection (int[] items){ 
     return new IntCollection(items); 
    } 
} 

Normalement, ce serait l'un des temps que les interfaces (IList<Foo> etc) aide - mais les interfaces ne fonctionnent pas souvent très bien dans les services Web. En fonction de ce que le code fait actuellement, vous pourriez être en mesure de faire un correctif "remplacer tout" - un peu drastique, cependant; à part ça ... vous allez devoir changer des morceaux de code.

quelques réflexions:

  • commutation à var (en C# 3.0) pourrait minimiser le changement - à savoir var orders = svc.GetOrders(); dans la plupart des cas, les différentes implémentations auront des API « assez similaires »
    • ReSharper pourrait être en mesure d'aider avec ce
  • LINQ (.ToList(), .ToArray()) pourrait servir de cale
+0

@ Marc - Je n'ai jamais vu l'opérateur implicite auparavant, serait utile dans certains de mes codes. Si sa collection est basée sur une liste générique, il peut utiliser le ToArray non linq. – stevehipwell

+0

ToArray est disponible sur les collections génériques sans LINQ – cjk

+0

@ck - Tous ne le font pas, par ex. Dictionnaire. – stevehipwell

0

Créez la collection fortement typée à partir du tableau. Par exemple, vous pouvez créer une liste générique à partir d'un tableau.

int[] oIntArray; 
List<int> = new List<int>(oIntArray); 
Questions connexes