Comment appeler une méthode d’extension sans utiliser

using System; class Runner { static void Main() { A a = new A(); // how to say a.PrintStuff() without a 'using' Console.Read(); } } class A { } namespace ExtensionMethod { static class AExtensions { public static void PrintStuff(this A a) { Console.WriteLine("text"); } } } 

Comment pourrais-je appeler la méthode d’extension sans utiliser? Et pas ExtensionMethod.AExtensions.PrintStuff (a), car cela n’utilise pas de méthode d’extension.

Il est possible d’appeler directement votre extension comme suit puisqu’il s’agit simplement d’une méthode statique, en passant l’instance sur laquelle il agira comme premier paramètre:

 A a = new A(); ExtensionMethod.AExtensions.PrintStuff(a); 

Cela pourrait être déroutant pour les autres développeurs qui rencontrent ce code si vous suiviez ce modèle pour les méthodes d’extension les plus couramment utilisées. Cela ferait également en sorte que les appels de chaînage tels que LINQ ressemblent davantage à un langage fonctionnel, car vous imbriqueriez chaque appel au lieu de les chaîner.

cela est possible si la méthode d’extension et la classe A dans le même espace de noms,

Si vous devez utiliser différents espaces de noms, vous devez utiliser, je ne pense pas qu’il existe un moyen de le faire sans using . Mais vous pouvez réduire le nombre d’ using en plaçant toutes les extensions dans un seul espace de noms, comme pour Linq ( System.Linq.Extensions ).

Remarque: vous pouvez supprimer l’espace de noms pour les méthodes d’extension, puis les rendre globalement disponibles.

Il faut using pour savoir où la fonction vit. Un exemple de ceci à Linq. Si System.Linq n’est pas utilisé, linq ne sera pas activé pour aucun de vos IEnumerable'

Cependant, vous pouvez définir la méthode d’extension dans le même espace-noms que l’appelant afin d’éviter de mettre une utilisation. Cette approche ne fonctionnera cependant pas si cela est nécessaire dans de nombreux espaces de noms.

Cela me fait me sentir sale, mais vous pouvez mettre vos méthodes d’extension dans l’espace de noms System. Cet espace de noms est inclus par défaut dans votre question

 using System; class Runner { static void Main() { A a = new A(); // how to say a.PrintStuff() without a 'using' Console.Read(); } } class A { } namespace System { static class AExtensions { public static void PrintStuff(this A a) { Console.WriteLine("text"); } } } 

Ruminations sur la création de méthodes d’extension pour un type ExtendableType :

  • Nommez la classe ExtendableTypeExtensions
  • Déclarez la classe d’extension partielle afin que les clients puissent append des méthodes d’extension suivant le même modèle; et
  • Placez les méthodes d’extension dans le même espace de noms que le type de base

sauf si vous avez une très bonne raison de suivre un modèle comme celui de LINQ :

  • Une grande famille de méthodes d’extension,
  • Cela s’applique à plusieurs classes de base.

Dans nos projets, les extensions sont placées dans le même espace de noms que l’extension de classe pour. Votre exemple:

 A.cs: using System; namespace ANamespace { class A { } } AExtensions.cs: namespace ANamespace { static class AExtensions { public static void PrintStuff(this A a) { Console.WriteLine("text"); } } } 

Désormais, lorsque vous ajoutez l’ using de ANamespace pour l’utilisation de la classe A , toutes les extensions de la classe A seront également incluses.