2011-02-13 18 views
37

Ho provato questo:Come creare un metodo di estensione per ToString?

public static class ListHelper 
{ 
    public static string ToString<T>(this IList<String> list) 
    { 
     return string.Join(", ", list.ToArray()); 
    } 

    public static string ToString<T>(this String[] array) 
    { 
     return string.Join(", ", array); 
    } 
} 

Ma non funziona, sia per string[] e List<string>. Forse ho bisogno di alcune annotazioni speciali?

risposta

86

metodi di estensione vengono controllati solo se ci sono esistono metodi candidati applicabili che corrispondono. Nel caso di una chiamata a ToString() ci sarà sempre essere un metodo candidato applicabile, vale a dire, lo ToString() su object.Lo scopo dei metodi di estensione è di estendere il set di metodi disponibili su un tipo, non su ignorare i metodi esistenti; è per questo che vengono chiamati "metodi di estensione". Se si desidera sovrascrivere un metodo esistente, sarà necessario eseguire un metodo di sovrascrittura.

+1

+1. Un riferimento a MSDN: http://msdn.microsoft.com/en-us/library/bb383977.aspx (vedere la sezione degli esempi) – madhurtanwani

3

semplicemente non si dovrebbe usare il nomeToString per il metodo di estensione in quanto non sarà mai chiamato perché quel metodo già esiste e non si dovrebbe usare T come il suo inutile lì.

Per esempio ho provato questo e ancora una volta restituito stessa cosa:

Console.WriteLine(lst.ToString<int>()); 

uscita:

shekhar, shekhar, shekhar, shekhar 

quindi questa volta ho usato int e ancora corse perché che T non ha alcun uso diverso da allora cambiando il metodo Prototype.

così semplicemente perché stai usando ToString letterale Nome metodo, in quanto già esiste e si non può prevalere in un metodo di estensione, questo è il motivo era necessario utilizzare che T per renderlo generico. Utilizzare un nome diverso come

public static string ToMyString(this IList<String> list) 

In questo modo non si dovrebbe usare generico in quanto inutile lì e si potrebbe semplicemente chiamare come sempre.


Detto questo, il codice funziona per me. Ecco quello che ho provato (in LINQPad):

void Main() 
{ 

    List<string> lst = new List<string>(); 
    lst.Add("shekhar"); 
    lst.Add("shekhar"); 
    lst.Add("shekhar"); 
    lst.Add("shekhar"); 
    lst.ToString<string>().Dump(); 
} 

    public static class ListHelper 
    { 
     public static string ToString<T>(this IList<String> list) 
     { 
      return string.Join(", ", list.ToArray()); 
     } 

     public static string ToString<T>(this String[] array) 
     { 
      return string.Join(", ", array); 
     } 
    } 

e la produzione ammontava shekhar, shekhar, shekhar, shekhar

Dal momento che si è specificato che T in ToString<T> è necessario parlare di un tipo come string o int durante la chiamata il Metodo ToString.

+0

Tuttavia quando chiamo files.ToString () funziona :) è più lungo dei file, ma mi piace ancora :) – IAdapter

+0

Come ho detto all'inizio ho eseguito questo codice in LINQPAD lì abbiamo il metodo Dump() per vedere cosa è all'interno di un oggetto .. nel normale programma C# basta chiamare 'Console.WriteLine (lst.ToString ());' –

+1

Si può passare qualsiasi cosa come T e funzionerà. Non stai usando il tipo generico nel metodo. files.ToString (), files.ToString (), var str = list.ToString >(), ecc. –

5

Sembra come se si desidera sostituire ciò che restituisce files.ToString(). Non sarà in grado di farlo senza dover scrivere una classe personalizzata per assegnare files come (cioè ereditano dalla lista ed eseguire l'override ToString().)

In primo luogo, sbarazzarsi del tipo generico (<T>), non lo si utilizza. Successivamente, dovrai rinominare il metodo di estensione perché chiamando files.ToString() chiamerai solo il metodo ToString dell'elenco.

Questo fa quello che stai cercando.

static class Program 
{ 
    static void Main() 
    { 
     var list = new List<string> { {"a"}, {"b"}, {"c"} }; 
     string str = list.ToStringExtended(); 
    } 
} 


public static class ListHelper 
{ 
    public static string ToStringExtended(this IList<String> list) 
    { 
     return string.Join(", ", list.ToArray()); 
    } 
} 
Problemi correlati