如何扩展 C # 内置类型,比如 String?

大家好... 我需要 Trim一个 String。但是我想移除 String 本身中所有重复的空格,而不仅仅是在它的结尾或开头。我可以用这样的方法:

public static string ConvertWhitespacesToSingleSpaces(string value)
{
value = Regex.Replace(value, @"\s+", " ");
}

这是我从 给你得到的。但是我希望这段代码在 String.Trim()本身内调用,所以我认为我需要扩展或重载或重写 Trim方法... 有办法做到这一点吗?

先谢谢你。

103798 次浏览

Is it possible? Yes, but only with an extension method

The class System.String is sealed so you can't use overriding or inheritance.

public static class MyStringExtensions
{
public static string ConvertWhitespacesToSingleSpaces(this string value)
{
return Regex.Replace(value, @"\s+", " ");
}
}


// usage:
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

Extension methods!

public static class MyExtensions
{
public static string ConvertWhitespacesToSingleSpaces(this string value)
{
return Regex.Replace(value, @"\s+", " ");
}
}

There's a yes and a no to your question.

Yes, you can extend existing types by using extension methods. Extension methods, naturally, can only access the public interface of the type.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}


// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

No, you cannot call this method Trim(). Extension methods do not participate in overloading. I think a compiler should even give you a error message detailing this.

Extension methods are only visible if the namespace containing the type that defines the method is using'ed.

Since you cannot extend string.Trim(). You could make an Extension method as described here that trims and reduces whitespace.

namespace CustomExtensions
{
//Extension methods must be defined in a static class
public static class StringExtension
{
// This is the extension method.
// The first parameter takes the "this" modifier
// and specifies the type for which the method is defined.
public static string TrimAndReduce(this string str)
{
return ConvertWhitespacesToSingleSpaces(str).Trim();
}


public static string ConvertWhitespacesToSingleSpaces(this string value)
{
return Regex.Replace(value, @"\s+", " ");
}
}
}

You can use it like so

using CustomExtensions;


string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

Gives you

text = "I'm wearing the cheese. It isn't wearing me!";

Besides using extension methods -- likely a good candidate here -- it is also possible to "wrap" an object (e.g. "object composition"). As long as the wrapped form contains no more information than the thing being wrapped then the wrapped item may be cleanly passed through implicit or explicit conversions with no loss of information: just a change of type/interface.

Happy coding.