2011-02-13 13 views
37

He intentado esto:¿Cómo crear un método de extensión para 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); 
    } 
} 

Pero no funciona, tanto para string[] y List<string>. Tal vez necesito algunas anotaciones especiales?

Respuesta

86

Los métodos de extensión sólo se verifican si hay no hay métodos aplicables candidatos que coincidan. En el caso de una llamada a ToString(), habrá siempre sea un método candidato aplicable, es decir, el ToString() en object.El propósito de los métodos de extensión es ampliar el conjunto de métodos disponibles en un tipo, no en anular métodos existentes; es por eso que se llaman "métodos de extensión". Si desea anular un método existente, tendrá que hacer un método de anulación.

+1

+1. Una referencia a MSDN: http://msdn.microsoft.com/en-us/library/bb383977.aspx (ver la sección de ejemplos) – madhurtanwani

3

Simplemente se no debe usar el nombreToString para el método de extensión, ya que nunca se llamará porque ese método ya existe y no se debe utilizar T como su inútil allí.

Por ejemplo he intentado esto y de nuevo volvió misma cosa:

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

de salida:

shekhar, shekhar, shekhar, shekhar 

así que esta vez he usado int y todavía corrió porque que T no tiene ningún uso aparte cambiando el Prototipo del Método.

Así que simplemente ¿Por qué utiliza ToString literal como nombre del método, puesto que ya existe y que no puede anularlo en un método de extensión, esta es la razón por la que tuvo que usar ese T para que sea genérico. Utilizar un nombre diferente, como

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

De esa manera no tendría que utilizar genérica como inútil allí y simplemente se podría llamar como siempre.


Dicho esto, su código funciona para mí. esto es lo que he intentado (en 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); 
     } 
    } 

Y la salida estaba shekhar, shekhar, shekhar, shekhar

Puesto que usted ha especificado que T en ToString<T> tendrá que hablar de un tipo como string o int al llamar al Método ToString.

+0

Sin embargo, cuando llamo a files.ToString () funciona :) es más largo que los archivos, pero me gusta :) – IAdapter

+0

Como dije en el inicio, ejecuté este código en LINQPAD, allí tenemos el método Dump() para vea qué hay dentro de un objeto ... en el programa normal de C# simplemente llame a 'Console.WriteLine (lst.ToString ());' –

+1

Puede pasar cualquier cosa como T y funcionará. No estás usando el tipo genérico en el método. files.ToString (), files.ToString (), var str = list.ToString >(), etc. –

5

Parece que quiere reemplazar lo que files.ToString() devuelve. Usted no será capaz de hacer eso sin tener que escribir una clase personalizada para asignar files como (es decir, heredan de la lista y anular ToString().)

En primer lugar, deshacerse de tipo genérico (<T>), que no se esté usando. A continuación, deberá cambiar el nombre del método de extensión porque al llamar al files.ToString() se llamará al método ToString de la Lista.

Esto hace lo que estás buscando.

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()); 
    } 
} 
Cuestiones relacionadas