编写泛型类型的扩展方法

时间:2016-04-13 11:13:39

标签: c# generics methods extension-methods

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

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()构造函数

3 个答案:

答案 0 :(得分:4)

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

  • 很糟糕,因为它创建了2个对象并且违反了StringBuilder哲学。
  • 无用,因为StringBuilder已经有一个Replace方法

答案 1 :(得分:0)

您的方法存在两个问题。给你错误的是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)

这是不可能的,它是泛型的限制(你不能约束string或类似的东西)。可能是一个很好的功能,你可以建议: - )

关于您的具体问题,它无法做您想做的事情:StringBuilderT是两种完全不同的类型,它们不共享任何有用的界面,没有有用的约束可以让你在泛型方法中使用它们(无论是否是扩展方法)。您可以针对此特定情况实施两种扩展方法。

关于 问题标题 &#34;为通用类型编写扩展方法&#34; ),是的,&#39 ;可以使用泛型这样的扩展方法,并且它适用于满足object约束的所有类型。没有特定的约束(比如接口),它没有多大意义,因为你不能基本上对对象做任何事情......如果你没有使用约束,你会更好关于制作public static int Compare<T>(this T value, T value2) where T : IComparable { return value.CompareTo(value2); } 的扩展方法。

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

-Wconversion

您希望确保第二个参数与扩展对象的类型相同。

答案 2 :(得分:0)

不幸的是,没有简单的方法可以实现这个目标

您不能使用任何从泛型中获取参数的构造函数。 它们纯粹受限于新的T()&#39;。

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