Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为所有IEnumerable重写ToString()方法<;Int32>;?_C#_.net_Overriding_Extension Methods - Fatal编程技术网

C# 如何为所有IEnumerable重写ToString()方法<;Int32>;?

C# 如何为所有IEnumerable重写ToString()方法<;Int32>;?,c#,.net,overriding,extension-methods,C#,.net,Overriding,Extension Methods,我想覆盖IEnumerable上的ToString() 我在考虑使用扩展方法 但是当我在下面执行此操作时,它仍然调用System.Object上的ToString()。当我重命名我的方法时,它会调用我的方法 由于我的扩展方法位于静态类中,因此无法重写 例如,在列表上调用.ToString()时,如何实现这一点,以便调用我的ToString()实现 public static class ExtensionMethods { public static new string ToStrin

我想覆盖
IEnumerable
上的
ToString()

我在考虑使用扩展方法

但是当我在下面执行此操作时,它仍然调用
System.Object上的
ToString()
。当我重命名我的方法时,它会调用我的方法

由于我的扩展方法位于静态类中,因此无法重写

例如,在
列表
上调用
.ToString()
时,如何实现这一点,以便调用我的
ToString()
实现

public static class ExtensionMethods
{
    public static new string ToString(this IEnumerable<Int32> set)
    {
        var sb = new StringBuilder();

        // Do some modifications on sb

        return sb.ToString();
    }
}
公共静态类扩展方法
{
公共静态新字符串到字符串(此IEnumerable集合)
{
var sb=新的StringBuilder();
//对某人做一些修改
使某人返回字符串();
}
}
不能使用扩展方法替换方法

方法解析将在尝试查找匹配的扩展方法之前检查属于该类型的方法

换句话说,您不能替换
ToString
,但可以创建自己的方法

使用重写的
ToString
方法创建自己的
IEnumerable
类型,或者使用不同的方法名称。当然,使用您自己的类型当然只有在您实际使用该类型时才起作用

例如,当我调用列表中的.ToString()时,如何实现这一点,以便调用我的ToString()实现

public static class ExtensionMethods
{
    public static new string ToString(this IEnumerable<Int32> set)
    {
        var sb = new StringBuilder();

        // Do some modifications on sb

        return sb.ToString();
    }
}
基本上,你不能。仅当找不到匹配的实例方法时才使用扩展方法

我建议你给你的方法起一个不同的名字,避免这个问题——以及你的方法可能引起的混乱

请注意,即使扩展方法优先于(比如)在
对象
上声明的方法进行匹配,也只会对使用
指令使用适当的
编译您自己的代码产生影响,而不是任何其他已经将调用绑定到正常调用的代码


如果您能提供更多关于您试图实现的目标的信息,我们可能会为您提供更多帮助-但目前,像
ToDelimiteString
(或您的方法所做的任何事情)这样的东西对我来说似乎是最好的选择。

不可能覆盖ToString,但您可以在任何地方调用,使用
IEnumerable

要将集合输出为字符串,我正在使用扩展方法

公共静态字符串到字符串(此IEnumerable消息)
{ 
返回到字符串(messages,Environment.NewLine,“”);
}
ToString(此IEnumerableMessage、字符串分隔符、字符串sComment)
在我的帖子里有描述

另见类似内容

作为扩展方法实现的类似功能,如后文所述:

您不能重写ToString,但可以创建泛型方法

这是一个基于Michael Freidgeim答案的简单解决方案(其链接已断开):


这个问题有点不清楚。是否要为
IEnumerable
或为
T
(在本例中为
Int32
)重写
ToString
?请注意,这两种方法都不能重写,但在每种情况下都可能应用不同的解决方案。我想重写“IEnumerable”上的ToString()。(由于某些原因,原始文本中删除了堆栈溢出。)使用反勾符号添加内联代码示例,我已经编辑了您的问题,只需点击编辑按钮查看我所做的操作。
static public class Extensions {

    // extension for arrays, lists, any Enumerable -> AsString
    public static string AsString<T>(this IEnumerable<T> enumerable) {
        var sb = new StringBuilder();
        int inx = 0;
        foreach (var item in enumerable) {
            sb.Append($"{inx}: {item}\r\n");
            inx++;
        }
        return sb.ToString();
    }
}
Console.WriteLine(arr.AsString());
Console.WriteLine(list.AsString());
Console.WriteLine(linqResult.AsString());