为泛型写一个扩展方法

Write an extension method for generic type

我需要编写扩展方法来替换字符串和 StringBuilder 中的字符。 我可以写两个扩展方法,如:

public static string ReplaceChar(this string value, string charToReplace)
{
    return value.Replace(charToReplace, "_");
}

public static StringBuilder ReplaceChar(this StringBuilder value, string charToReplace)
{
    return new StringBuilder (value.ToString().Replace(charToReplace, "_"));
}

但我不知道是否有可能编写一个通用方法,如:

public static T ReplaceChar<T>(this T value, string charToReplace)
{
    return new T(value.ToString().Replace(charToReplace, "_"));
}

在这种情况下我有一个错误:T 没有 new() 构造函数

您的方法有两个问题。给你错误的是 T 需要有一个 new() 约束,如果你想 new 它:

public static T ReplaceChar<T>(this T value, string charToReplace)
     where T : new()

第二个问题是约束只说它有一个无参数的构造函数,你不能调用带参数的构造函数...所以:

return new T(value.ToString().Replace(charToReplace, "_"));

是不可能的,这是泛型的限制(你不能对 new(string) 或类似的东西进行约束)。可能是一个不错的功能,您可以推荐它:-)

所以关于你的具体问题,不可能做你想做的:stringStringBuilder是两种完全不同的类型,它们不共享任何有用的接口,也没有有用的约束这可能会让您在通用方法中同时使用两者(无论是否是扩展方法)。您要为这个特定案例实施这两种扩展方法。

关于问题标题("Write an extension method for generic type"),是的,是可能有这样一个带有泛型的扩展方法,它适用于满足 T 约束的所有类型。没有特定的约束(比如接口)就没有多大意义,因为你基本上无法用 object 做任何事情......如果你不使用约束,你最好做object.

的扩展方法

我想到的唯一可能有用的事情是,如果尝试创建一个类型的扩展方法,该方法需要将相同类型作为附加参数传递...类似于:

public static int Compare<T>(this T value, T value2)
    where T : IComparable
{
    return value.CompareTo(value2);
}

您要确保第二个参数与扩展 object.

的类型相同

不幸的是,没有简单的方法可以做到这一点

您不能使用任何从泛型获取参数的构造函数。 它们仅限于“new T()”。

您可以使用反射来解决这个问题,但它会使您的代码难以理解并妨碍编译时类型检查。

这是一个非常糟糕的主意。您希望以相同的方式使用不可变类型和可变类型。 StringBuilder 的唯一作用是为字符串操作提供更好的速度性能。您的 StringBuilder 扩展方法糟糕且无用。

  • 糟糕,因为它创建了 2 个对象并且违反了 StringBuilder 的理念。
  • 没用,因为 StringBuilder 已经有 Replace 方法