C# 扩展方法重载

标签 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)
    {
        return ToString<object>(list, delimiter);
    }

当我使用它时:

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

这是行不通的。 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 "";
    }

最佳答案

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

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

所以您基本上可以删除所有这些方法并只使用它,除非您真的希望它作为列表的扩展方法。

关于C# 扩展方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10569348/

相关文章:

python - 无法重载 python socket.send

Java:重写具有不同返回类型的派生类中的方法?

java - php像java中一样重新声明函数

c# - 扩展方法未返回正确的集合

android - 我们可以在 Android 中创建自定义 Synthetic Kotlin Extensions 吗?

c# - 如何从查询中删除所有参数的值

c# - IPN模拟器错误

ios - 迭代 Swift 扩展中的可用类?

c# - KinectRegion HandPointer 光标作为 Awesomium 浏览器中的鼠标光标

c# - AuthenticateAndContinue 错误 WP 8.1