我需要编写一个扩展方法来替换字符串和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()构造函数
答案 0 :(得分:4)
这是一个非常糟糕的主意。您希望以相同的方式使用不可变类型和可变类型。 StringBuilder的唯一作用是为字符串操作提供更好的速度性能。你的StringBuilder扩展方法很糟糕且无用。
答案 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
或类似的东西)。可能是一个很好的功能,你可以建议: - )
关于您的具体问题,它无法做您想做的事情:StringBuilder
和T
是两种完全不同的类型,它们不共享任何有用的界面,没有有用的约束可以让你在泛型方法中使用它们(无论是否是扩展方法)。您可以针对此特定情况实施两种扩展方法。
关于 问题标题 (&#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;。
您可以使用反射来解决这个问题,但它会使代码难以理解并阻止编译时类型检查。