2010-07-21 6 views
3

J'ajoute des fonctionnalités à une collection .Net existante. Pour ce faire, je remplace plusieurs fonctions. Je n'ai pas pu remplacer la valeur de retour du retour de tableau de base dans la collection. Par exemple, si j'appelle emailMessage.To [i], il ne renvoie pas la valeur correcte, mais si j'appelle emailMessage.Item (i), il renvoie la valeur correcte. Voici le code de ma classe. De quoi ai-je besoin pour remplacer pour corriger la première erreur?Remplacer l'index Retour dans la collection C#

namespace EmailService 
{ 
    public class MailAddressCollection : System.Net.Mail.MailAddressCollection 
    { 
     public MailAddressCollection() : base() 
     { 
     } 

     public void Add(MailAddress Address) 
     { 
      base.Add(Address); 
     } 

     public MailAddress Item(int index) 
     { 
      return (MailAddress)(base.Items[index]); 
     } 

    } 
} 
+1

double possible [Comment surcharger l'opérateur-support carré en C#?] (Http://stackoverflow.com/questions/287928/how-do-i-overload- the-square-bracket-operator-in-c) –

+0

Voir cette question: [Comment surcharger l'opérateur de carré en C#?] (http://stackoverflow.com/questions/287928/how-do-i -overload-the-square-bracket-operator-in-c) –

+0

Je pense qu'il est préférable d'utiliser la composition au lieu de l'héritage dans ce cas pour adhérer au [principe de substitution de Liskov] (http://en.wikipedia.org/wiki/Liskov_substitution_principle) –

Répondre

7
public MailAddress this[int index] 
{ 
    get { return ((MailAddress)(base.Items[index]); } 
} 
+0

Seul problème ... la classe de base al ready définit cet indexeur. –

+0

@Brian: il peut être caché avec le mot-clé 'new'. –

+0

J'avais besoin du nouveau mot-clé. "public nouveau MailAddress this [int index]" – SchwartzE

6

Vous êtes un peu de chance, parce que MailAddressCollection ne définit pas l'indexeur comme virtuel.

Vous pouvez utiliser le nouveau mot-clé:

public new MailAddress this[int index] 
{ 
    get 
    { 
     return base[index];  
    }   
} 

Mais, votre indexeur ne fonctionnera que si vous avez une référence à votre type de collection. Si vous utilisez le polymorphisme, votre indexeur ne sera pas appelé.

+3

Beaucoup mieux répondre. – IvanP

0

Ou bien

public MailAddress this[int index] 
    { 
     get { return base[index] as MailAddress; } 
    } 
Questions connexes