我想覆盖ToString()
上的IEnumerable<Int32>
。
我正在考虑使用扩展方法。
但是当我在下面执行此操作时,它仍会调用ToString()
上的System.Object
。当我重命名我的方法时,它会调用我的方法。
由于我的扩展方法是静态类,我无法覆盖。
我如何实现这一目标,以便在ToString()
上呼叫.ToString()
时调用我的List<Int32>
实现?
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();
}
}
答案 0 :(得分:9)
基本上,你不能。如果找不到匹配的实例方法,则扩展方法仅 。我如何实现这一点,以便在我调用List上的.ToString()时调用我的ToString()实现?
我建议你给你的方法一个不同的名字,避免问题 - 以及你的方法可能造成的混淆。
请注意,即使扩展方法 优先于object
上声明的(例如)方法匹配,也只会使用适当的{{编译自己的代码。 1}}指令 - 不是任何已经将调用绑定到正常调用的其他代码。
如果您可以提供有关您要实现的目标的更多信息,我们可以为您提供更多帮助 - 但目前,像using
(或您的方法所做的)听起来像是最好的打赌我。
答案 1 :(得分:3)
您无法使用扩展方法替换方法。
方法解析将在尝试查找匹配的扩展方法之前检查属于该类型的方法。
换句话说,您无法替换ToString
,但是,您可以创建自己的方法。
使用重写的IEnumerable<T>
方法创建自己的ToString
类型,或使用其他方法名称。当然,使用您自己的类型当然只有在您实际使用该类型时才会起作用。
答案 2 :(得分:0)
无法覆盖ToString,但您可以在IEnumerable<Int32>
要将集合输出为字符串,我使用的是扩展方法
public static string ToString<T>( this IEnumerable<T> messages)
{
return ToString<T>(messages, Environment.NewLine, "" );
}
ToString<T>( this IEnumerable<T>messages, string separator, string sComment)
在我的帖子中描述 ToString function for Generic List
另请参阅类似的Overriding ToString() of List<MyClass>
类似的功能实现为post中描述的扩展方法: Separator Delimited ToString for Array, List, Dictionary, Generic IEnumerable
答案 3 :(得分:0)
您不能覆盖ToString,但是可以创建通用方法。
这是基于Michael Freidgeim的答案(链接已断开)的简单解决方案:
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());