C# 扩展方法重载

本文关键字:重载 方法 扩展 | 更新日期: 2023-09-27 18:34:04

>我有两个扩展方法:

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

当我使用它时:

    char delimiter = ' ';
    return tokens.ToString(delimiter);

这是行不通的。 字符重载也不会显示在代码完成列表中。 谁能告诉我如何做到这一点?

编辑

我不小心忘了提到实际上有 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 "";
    }

C# 扩展方法重载

添加对具有扩展方法的类的引用:

using MyApplicationNamespace.ToStringExtensionClass;

VS/ReSharper不提供自动添加引用,仅仅是因为该方法已被识别,只是没有该特定签名。

此外,除非有第三个带有泛型参数的扩展方法,否则您的方法本身不会编译。

他们为我工作的方式(编译和逻辑(:

public static string ToString(this List<object> list, char delimiter)
{
    return ToString(list, delimiter.ToString());
}
public static string ToString(this List<object> list, string delimiter)
{
    return string.Join(delimiter, list);
}

然后,用法将是:

var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.Cast<object>().ToList().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)
{
    return string.Join(delimiter, list);
}

然后用法更干净:

var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.ToString(' ');

编辑

因此,在您编辑后,我更好地了解您的问题。您应该丢失非泛型方法,并且也具有泛型重载以接受 char。

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

带有字符串分隔符的原始函数只是调用自己,因此您必须更改ToString<T>(this List<T> list, string delimiter)才能在此处执行有用的操作,例如 String.join