2011-02-13 111 views
37

我已经试过这样:如何为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); 
    } 
} 

但它不工作,既为string[]List<string>。也许我需要一些特殊的注释?

回答

86

扩展方法只检查。在致电ToString()的情况下,总会有为适用的候选方法,即ToString()object。扩展方法的目的是为了将扩展为上的一组可用方法,而不是将覆盖为现有的方法;这就是为什么他们被称为“扩展方法”。如果你想重写一个现有的方法,那么你将不得不作出重写的方法。

+1

+1。对MSDN的引用:http://msdn.microsoft.com/en-us/library/bb383977.aspx(请参阅示例部分) – madhurtanwani

3

只要你不宜用名称ToString的扩展方法,因为它永远不会被调用,因为该方法已经存在,你不应该使用T作为其用武之地那里。

例如我想这和它再次回到同一件事:

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

输出:

shekhar, shekhar, shekhar, shekhar 

所以这一次我用int,它仍然跑了,因为T没有其他用途则改变方法原型。

那么简单,为什么您使用的ToString文字作为方法名称,因为它已经存在,你不能在扩展方法覆盖它,这是你不得不使用T使它通用的原因。使用一些不同的名称,如

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

这样你就不必使用泛型,因为它在那里没用,你可以直接调用它。


这就是说你的代码适合我。以下是我(在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); 
     } 
    } 

输出功率为shekhar, shekhar, shekhar, shekhar

既然你已经指定了TToString<T>你需要提一类像stringint同时调用ToString方法。

+0

但是,当我调用files.ToString ()它确实工作:)它比文件更长,但我仍然喜欢它:) – IAdapter

+0

正如我在开始说我在LINQPAD中运行此代码那里我们有转储()方法看看对象里面有什么......在正常的C#程序中调用'Console.WriteLine(lst.ToString ());' –

+1

你可以传递任何东西作为T,它会工作。您不在方法中使用泛型类型。 files.ToString (),files.ToString (),var str = list.ToString >()等。 –

5

这听起来像你想要取代什么files.ToString()返回。你将不能够做到这一点,而无需编写自定义类来分配files相同(即从名单继承和覆盖ToString()

首先,摆脱了一般类型(<T>)的,你不使用它。接下来,您将需要重命名扩展方法,因为调用files.ToString()将只调用List的ToString方法。

这就是你要找的。如果有没有适用的候选方法匹配

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