web-dev-qa-db-fra.com

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

Salutations à tous ... J'ai besoin de Trim a 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 de ici . Mais je veux que ce morceau de code soit appelé dans la String.Trim() elle-même, alors je pense que je dois étendre, surcharger ou surcharger la méthode Trim ... Y a-t-il un moyen de le faire ?

Merci d'avance.

80
Girardi

Puisque vous ne pouvez pas étendre string.Trim (). Vous pouvez créer une méthode d'extension telle que décrite ici qui limite 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!";
147
JoeyRobichaud

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

La classe System.String est scellé afin que vous ne puissiez pas utiliser la priorité ou l'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();
22
Henk Holterman

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

Oui, vous pouvez étendre des types existants à l'aide de méthodes d'extension. Les méthodes d'extension ne peuvent naturellement 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 définissant la méthode est utilisé.

10
Arne

Méthodes d'extension!

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

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

Bonne codage.

2
user166390