繁体   English   中英

如何为ToString创建扩展方法?

[英]How to create an extension method for 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>都不起作用。 也许我需要一些特殊的注释?

仅在没有匹配的适用候选方法时才检查扩展方法。 在调用ToString()的情况下, 总会有一个适用的候选方法,即object上的ToString() 的扩展方法的目的是延长上的类型的可用的一套方法,不重写现有的方法; 这就是为什么他们被称为“扩展方法”。 如果要覆盖现有方法,则必须创建重写方法。

听起来你想要替换什么文件files.ToString()返回。 如果没有编写自定义类来分配files (即从List继承并覆盖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());
    }
}

只是你不应该使用名称ToString作为Extension方法,因为它永远不会被调用,因为该方法已经存在, 你不应该使用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

由于您已在ToString<T>指定了T ,因此在调用ToString方法时需要提及类似stringint的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM