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.

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!";

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();

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.



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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.