C#扩展方法重载
我有两种扩展方法:C#扩展方法重载,c#,extension-methods,overloading,C#,Extension Methods,Overloading,我有两种扩展方法: public static string ToString(this List<object> list, char delimiter) { return ToString<object>(list, delimiter.ToString()); } public static string ToString(this List<object> list, string delimiter
public static string ToString(this List<object> list, char delimiter)
{
return ToString<object>(list, delimiter.ToString());
}
public static string ToString(this List<object> list, string delimiter)
{
return ToString<object>(list, delimiter);
}
using MyApplicationNamespace.ToStringExtensionClass;
这行不通。char重载也不会显示在代码完成列表中。有人能告诉我怎么做吗
编辑
我不小心忘了提到实际上有3种扩展方法,第三种是:
public static string ToString<T>(this List<T> list, string delimiter)
{
if (list.Count > 0)
{
string s = list[0].ToString();
for (int i = 1; i < list.Count; i++)
s += delimiter + list[i].ToString();
return s;
}
return "";
}
公共静态字符串ToString(此列表,字符串分隔符)
{
如果(list.Count>0)
{
字符串s=列表[0]。ToString();
for(int i=1;i
添加对包含扩展方法的类的引用:
public static string ToString(this List<object> list, char delimiter)
{
return ToString<object>(list, delimiter.ToString());
}
public static string ToString(this List<object> list, string delimiter)
{
return ToString<object>(list, delimiter);
}
using MyApplicationNamespace.ToStringExtensionClass;
VS/ReSharper不提供自动添加引用,因为该方法已经被识别,只是没有特定的签名
此外,除非有第三个带有泛型参数的扩展方法,否则方法本身不会编译
它们为我工作的方式(编译和逻辑):
因此,您基本上可以删除所有这些方法并使用它们,除非您真的希望它作为列表的扩展方法。我认为您的问题在于您正在为泛型列表指定对象类型,而不是将其作为泛型方法 当您定义以下内容时,请查看它是否有效:
public static string ToString<T>(this List<T> list, char delimiter)
{
return ToString<T>(list, delimiter.ToString());
}
public static string ToString<T>(this List<T> list, string delimiter)
{
return String.join(list, delimiter);
}
公共静态字符串ToString(此列表,字符分隔符)
{
返回ToString(列表,分隔符.ToString());
}
公共静态字符串ToString(此列表,字符串分隔符)
{
返回String.join(列表,分隔符);
}
您使用字符串分隔符的原始函数只是在调用自身,因此您必须更改
ToString(此列表,字符串分隔符)
,以便在此处执行一些有用的操作,例如字符串。join是仅我还是您的ToString方法无限期地调用自身?这是tokens变量的类型?请参阅编辑以获取我的答案,作为编辑的后续操作。最后一个ToString应该真正使用StringBuilder,而不是将列表项附加到本地字符串…@MikeCorcoran它应该实际使用string.Join
。。。这显然和StringBuilder一样快,因为你已经在某种IEnumerable中拥有了所有的子字符串。我不太确定如何实现你所描述的。我想我是个新手。我尝试过:return ListExtensions.ToString(标记,分隔符);它将显示char重载,但出于某种原因它不喜欢令牌…@Thick\u propheT这可能是因为您没有使方法通用,这意味着它需要列表-哪些令牌不是。在答案的末尾尝试使用两个通用方法。你是对的,我尝试了:return ListExtension.ToString(new List(),delimiter);满意率达110%XD@Thick_propheT这将创建一个新的空列表。。。你确定这就是你使用的代码吗?哦,不,这绝对不是我需要的,我只是想看看怎样才能满足visual studio的要求。这将导致无休止和无用的递归。哈哈,是的,我现在明白了。我实际上不知道原始海报在字符串扩展方法中尝试了什么。我想这是他们称之为StackOverflow的原因,因为他想要一个字符串,并使用一个列表和分隔符来缩小选项范围。
public static string ToString<T>(this List<T> list, char delimiter)
{
return ToString(list, delimiter.ToString());
}
public static string ToString<T>(this List<T> list, string delimiter)
{
return string.Join(delimiter, list);
}
var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.ToString(' ');
public static string ToString<T>(this List<T> list, char delimiter)
{
return ToString(list, delimiter.ToString());
}
public static string ToString<T>(this List<T> list, string delimiter)
{
...
}
string.Join(delimiter, list);
public static string ToString<T>(this List<T> list, char delimiter)
{
return ToString<T>(list, delimiter.ToString());
}
public static string ToString<T>(this List<T> list, string delimiter)
{
return String.join(list, delimiter);
}