为泛型写一个扩展方法
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)
或类似的东西进行约束)。可能是一个不错的功能,您可以推荐它:-)
所以关于你的具体问题,不可能做你想做的:string
和StringBuilder
是两种完全不同的类型,它们不共享任何有用的接口,也没有有用的约束这可能会让您在通用方法中同时使用两者(无论是否是扩展方法)。您要为这个特定案例实施这两种扩展方法。
关于问题标题("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 方法
我需要编写扩展方法来替换字符串和 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)
或类似的东西进行约束)。可能是一个不错的功能,您可以推荐它:-)
所以关于你的具体问题,不可能做你想做的:string
和StringBuilder
是两种完全不同的类型,它们不共享任何有用的接口,也没有有用的约束这可能会让您在通用方法中同时使用两者(无论是否是扩展方法)。您要为这个特定案例实施这两种扩展方法。
关于问题标题("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 方法