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 :
sauf si vous avez une très bonne raison de suivre un modèle comme celui de LINQ :
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.