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