106 votes

Comment puis-je étendre une classe avec des méthodes d'extension c #?

Les méthodes d'extension peuvent-elles être appliquées à la classe?

Par exemple, étendez DateTime pour inclure une méthode Tomorrow () pouvant être appelée, par exemple:

 DateTime.Tomorrow();
 

Je sais que je peux utiliser

 static DateTime Tomorrow(this Datetime value) { //... }
 

Ou

 public static MyClass {
  public static Tomorrow() { //... }
}
 

pour un résultat similaire, mais comment puis-je étendre DateTime pour pouvoir appeler DateTime.Tomorrow?

195voto

Kumu Points 951

Créer des méthodes d’Extension : http://msdn.microsoft.com/en-us/library/bb383977.aspx

Ex :

utilisation :

71voto

Andrew Hare Points 159332

Vous ne pouvez pas ajouter de méthodes à un type existant, vous pouvez uniquement ajouter des méthodes qui semblent appartenir au type existant via des méthodes d'extension. Etant donné que c'est le cas, vous ne pouvez pas ajouter de méthodes statiques au type lui-même car les méthodes d'extension utilisent des instances de ce type.

Rien ne vous empêche de créer votre propre méthode d'assistance statique comme celle-ci:

 static class DateTimeHelper
{
    public static DateTime Tomorrow
    {
    	get { return DateTime.Now.AddDays(1); }
    }
}
 

Ce que vous utiliseriez comme ceci:

 DateTime tomorrow = DateTimeHelper.Tomorrow;
 

19voto

ShuggyCoUk Points 24204

Les méthodes d'Extension sont sucre syntaxique pour la fabrication de méthodes statiques dont le premier paramètre est une instance de type T, regardent comme si ils ont une méthode d'instance sur T.

En tant que tel, le bénéfice est en grande partie perdu, où vous faire "statiques les méthodes d'extension' car ils ne servent qu'à embrouiller le lecteur de code encore plus qu'une méthode d'extension (car ils semblent être pleinement qualifié mais ne sont pas définis dans cette classe) pour ne syntaxique du gain (de la chaîne d'appels dans un fluide style à l'intérieur de Linq par exemple).

Puisque vous devez apporter les extensions à portée avec une aide de toute façon je dirais que c'est plus simple et plus sûr de créer:

public static class DateTimeUtils
{
    public static DateTime Tomorrow { get { ... } }
}

Et puis l'utiliser dans votre code par:

WriteLine("{0}", DateTimeUtils.Tomorrow)

11voto

Adrian Godong Points 5367

Hmm... c'est effectivement une question très intéressante. :D

Le plus proche que je peux obtenir la réponse est par l'ajout d'une méthode d'extension en System.Type objet. Pas joli, mais tout de même intéressants.

public static class Foo
{
    public static void Bar()
    {
        var now = DateTime.Now;
        var tomorrow = typeof(DateTime).Tomorrow();
    }

    public static DateTime Tomorrow(this System.Type type)
    {
        if (type == typeof(DateTime)) {
            return DateTime.Now.AddDays(1);
        } else {
            throw new InvalidOperationException();
        }
    }
}

Sinon, l'OMI Andrew et ShuggyCoUk a une meilleure mise en œuvre.

2voto

mimo Points 408

Je voudrais faire la même chose que Kumu

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime Tomorrow(this DateTime date)
        {
           return date.AddDays(1);
        }    
    }
}

mais l'appeler comme cela new DateTime().Demain();

Pense qu'il est plus parlent que DateTime.Maintenant.Demain();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X