Comment étendre les types intégrés C #, comme String?

89

Salutations à tous ... je dois Trima String. Mais je veux supprimer tous les espaces vides répétés dans la chaîne elle-même, pas seulement à la fin ou au début de celle-ci. Je pourrais le faire avec une méthode comme:

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

Ce que j'ai obtenu d' ici . Mais je veux que ce morceau de code soit appelé à l'intérieur de String.Trim()lui - même, donc je pense que je dois étendre ou surcharger ou remplacer la Trimméthode ... Y a-t-il un moyen de le faire?

Merci d'avance.

Girardi
la source

Réponses:

164

Puisque vous ne pouvez pas prolonger string.Trim(). Vous pouvez créer une méthode d'extension comme décrit ici qui coupe et réduit les espaces.

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

Vous pouvez l'utiliser comme ça

using CustomExtensions;

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

Vous donne

text = "I'm wearing the cheese. It isn't wearing me!";
JoeyRobichaud
la source
Le fichier a-t-il besoin d'un nom spécial? Ou où enregistrez-vous cela? Peut-il être mis dans une classe Util ou quelque chose comme ça?
test le
1
@testing Vous pouvez les placer n'importe où tant qu'ils sont référencés dans votre projet. Si vous les mettez dans un espace de noms spécifique, insérez-les simplement avec une instruction «using» comme n'importe quelle autre classe.
Twicetimes
pourquoi n'avez-vous pas renvoyé l'expression régulière directement à partir de la fonction TrimAndReduce? cela aurait rendu votre réponse beaucoup plus simple à lire. À moins que vous n'utilisiez tellement votre réponse que vous deviez l'appeler ailleurs LOL
quemeful
23

C'est possible? Oui, mais uniquement avec une méthode d'extension

La classe System.Stringest scellée, vous ne pouvez donc pas utiliser de remplacement ou d'héritage.

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

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();
Henk Holterman
la source
5
Pour être clair, non, il n'est pas possible de modifier les actions entreprises String.Trim.
Michael Petrotta
10

Il y a un oui et un non à votre question.

Oui, vous pouvez étendre les types existants à l'aide de méthodes d'extension. Les méthodes d'extension, naturellement, ne peuvent accéder qu'à l'interface publique du type.

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

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

Non, vous ne pouvez pas appeler cette méthode Trim(). Les méthodes d'extension ne participent pas à la surcharge. Je pense qu'un compilateur devrait même vous donner un message d'erreur détaillant cela.

Les méthodes d'extension ne sont visibles que si l'espace de noms contenant le type qui définit la méthode utilise'ed.

Arne
la source
7

Méthodes d'extension!

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

En plus d'utiliser des méthodes d'extension - probablement un bon candidat ici - il est également possible d '"envelopper" un objet (par exemple, "composition d'objet"). Tant que le formulaire encapsulé ne contient pas plus d'informations que l'objet encapsulé, l'élément encapsulé peut être proprement passé par des conversions implicites ou explicites sans perte d'informations: juste un changement de type / d'interface.

Bon codage.


la source