如何扩展C#内置类型(如String)?


89

问候大家...我需要Trim一个String。但是我想删除String本身中所有重复的空格,而不仅是在字符串的结尾或开头。我可以用类似的方法做到这一点:

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

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

提前致谢。

Answers:


163

由于您无法扩展string.Trim()。您可以按照此处描述的那样扩展和缩小空白。

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+", " ");
        }
    }
}

你可以这样使用

using CustomExtensions;

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

给你

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

文件是否需要特殊名称?还是在哪里保存?可以将其放入Util类中吗?
测试

1
@testing您可以将它们放置在项目中的任何位置,只要它们被引用即可。如果将它们放在特定的名称空间中,则只需像其他任何类一样使用“ using”语句将它们引入即可。
两次2014年

为什么不从TrimAndReduce函数返回正则表达式呢?它会使您的答案更容易阅读。除非你使用你的答案这么多,你需要调用其他地方LOL
quemeful

23

可能吗?是的,但只能使用扩展方法

该类System.String是密封的,因此您不能使用重写或继承。

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

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

5
需要明确的是,不行,无法修改要执行的操作String.Trim
Michael Petrotta

10

您的问题有一个是与否。

是的,您可以使用扩展方法来扩展现有类型。扩展方法自然只能访问该类型的公共接口。

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

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

不,您不能调用此方法Trim()。扩展方法不参与重载。我认为编译器甚至应该给您一条错误消息,详细说明这一点。

仅当包含定义该方法类型的名称空间正在使用时,扩展方法才可见。



2

除了使用扩展方法(在这里可能是一个不错的选择)之外,还可以“包装”对象(例如“对象组合”)。只要包装的表单所包含的信息不超过包装的东西,那么包装的项目就可以通过隐式或显式转换而干净地传递,而不会丢失任何信息:只需更改类型/接口即可。

快乐的编码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.