Comment remplacer une extension existante méthode
Je veux remplacer les méthodes d'extension inclus dans le .NET ou ASP MVC par mes propres méthodes.
Exemple
public static string TextBox(this HtmlHelper htmlHelper, string name)
{
...
}
Est-il possible? Je ne peux pas utiliser le remplacement ou nouveau mot-clé.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: Cette question a été le sujet de mon blog en décembre 2013. Merci pour la grande question!
Vous pouvez le faire, dans un sens. Mais je devrais commencer par parler brièvement le principe de conception de base de résolution de surcharge en C#. Toutes les résolution de surcharge est, bien sûr, sur la prise d'un ensemble de méthodes avec le même nom et en choisissant de définir l'unique meilleur membre de l'appeler.
Il y a beaucoup de facteurs impliqués dans la détermination de qui est la "meilleure" méthode; langues différentes d'utiliser un autre "mélange" des facteurs de comprendre cela. C# en particulier fortement poids "proximité" d'une méthode donnée pour le site d'appel. Si le choix entre une méthode dans une classe de base ou d'une nouvelle méthode applicable dans une classe dérivée, C# prend une dans la classe dérivée, car elle est la plus proche, même si l'un dans la classe de base est de toute autre manière une meilleure correspondance.
Et nous avons donc courir en bas de la liste. Les classes dérivées sont plus proches que les classes de base. Les classes internes sont plus près que l'extérieur des classes. Méthodes dans la hiérarchie de classe sont plus proches que les méthodes d'extension.
Et nous en arrivons maintenant à votre question. La proximité d'une extension de la méthode dépend (1) de combien d'espaces de noms "out" n'avons-nous aller? et (2) ne nous trouvons la méthode d'extension via
using
ou était-il là, dans l'espace de noms? Par conséquent, vous pouvez influer sur la résolution de surcharge en modifiant en ce que l'espace de noms de votre statique de la classe d'extension apparaît, pour le mettre dans un plus proche de l'espace de noms pour le site d'appel. Ou, vous pouvez modifier votreusing
déclarations, de mettre leusing
de l'espace de noms qui contient le désiré statique de la classe de plus près que les autres.Par exemple, si vous avez
alors qu'il est ambigu qui est plus proche. Si vous voulez donner la priorité à la vôtre sur les leurs, vous pouvez choisir de faire ceci:
Et maintenant, lors de la résolution de surcharge va à résoudre l'extension de l'appel de méthode, des cours de
Blorple
obtenir d'aller d'abord, puis les classes dansFrobCo.MyExtensionNamespace
, puis les classes dansFrobCo
, et puis les classes dansBazCo.TheirExtensionNamespace
.Est-ce clair?
FrobCo.MyExtensionNamespace
pas de plus près à toute classeFrobCo.Blorble
queBazCo.TheirExtensionNamespace
? Me semble que pour le BazCo-les extensions que vous auriez besoin d'aller jusqu'à deux niveaux de l'espace de noms et puis deux autres, alors que pour FrobCo-extensions vous avais seulement besoin d'aller vers le haut puis vers le bas un espace de noms de niveau. Donc, pour moi, la FrobCo-extensions semblent plus étroite.Les méthodes d'Extension ne peuvent pas être remplacés, car ils ne sont pas les méthodes d'instance et qu'ils ne sont pas virtuels.
Le compilateur va se plaindre si vous importez à la fois de la méthode d'extension par le biais des classes de l'espace de noms qu'il ne saura pas quelle est la méthode à appeler:
La seule façon de contourner cela est d'appeler votre méthode d'extension en utilisant une méthode statique de la syntaxe. Ainsi, au lieu de cela:
que vous avez à faire cela:
Les méthodes d'Extension sont en fait que des méthodes statiques, donc je ne sais pas comment vous pouvez les remplacer, mais si vous il suffit de les placer dans un espace de noms différent, alors vous pouvez appeler le vôtre à la place de celui que vous souhaitez remplacer.
Mais Matt Manela parle de la façon dont les méthodes d'instance ont la priorité sur les méthodes d'extension:
http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/e42f1511-39e7-4fed-9e56-0cc19c00d33d
Pour plus d'idées sur les méthodes d'extension, vous pouvez regarder http://gen5.info/q/2008/07/03/extension-methods-nulls-namespaces-and-precedence-in-c/
Edit: j'ai oublié à propos de l'ambiguïté de la question, de sorte que votre meilleur pari est d'essayer de ne pas y compris les méthodes d'extension que vous souhaitez remplacer. Donc, vous devrez peut-être de ne pas utiliser le 'l'aide de la directive, mais il suffit de mettre dans le nom complet du paquet de certaines classes, ce qui pourrait résoudre le problème.
Basé sur Eric le site (et le fait que les vues de code est rendu en ASP espace de noms), vous devez être en mesure de remplacer comme ça (au moins il travaille pour moi dans ASP.NET MVC4.0 Rasoir
Notez l'espace de noms doit être "ASP".
Dans les réponses, vous pouvez également "remplacer" les méthodes d'extension de l'altération de la signature de la méthode:
1.) L'utilisation d'un type spécifique
Cela ne peut bien sûr être utilisés si le type de cible est plus spécifique que celui de l'actuelle méthode d'extension. Aussi, il peut être nécessaire de le faire pour tous les types.
2.) Ajouter un paramètre fictif
Pas aussi jolie. Aussi, cela va vous obliger à modifier les appels existants pour inclure l'argument.