web-dev-qa-db-fra.com

Méthodes d'extension non reconnues

Que faut-il pour qu'une méthode d'extension soit prise en compte lorsqu'elle existe dans un assembly importé? J'en ai construit un dans un projet de bibliothèque de classe, mais il n'est pas reconnu dans mon projet Web faisant référence à la bibliothèque. Toutes les autres classes et méthodes de la bibliothèque sont honorées et visibles, mais cette méthode d'extension ne l'est pas. La méthode d'extension est visible lorsqu'elle est utilisée dans la bibliothèque.

42
ChiliYago

Référencer un assembly contenant une classe avec des méthodes d'extension ne suffit pas. Vous devez importer l'espace de noms contenant la classe dans chacun de vos fichiers source où vous souhaitez utiliser les méthodes d'extension.

Par exemple, pour utiliser LINQ-to-objects, vous devez référencer le System.Core Assembly et importer le System.Linq namespace (qui contient la classe Enumerable avec les méthodes d'extension LINQ):

using System.Linq;
56
dtb

Etes-vous sûr que la méthode d'extension est rendue publique?

17
Arjan Einbu

Si la méthode Extension est appelable sans utiliser la syntaxe Extension, utilisez la commande Format:

this.MyExtensionMethod()

Cela a éclairci mon problème de ne pas trouver la méthode d'extension d'une classe dans VS2010.

12

Pour tous ceux qui atterrissent ici avec le même problème dans VB.NET, notez que non seulement la méthode d'extension, mais le module doit lui-même être marqué en tant que Publicsinon vous obtiendrez cette erreur. C'est le cas au moins avec VS2015 Community et le sera probablement aussi dans d'autres versions.

2
dotNET

Pour un exemple d'implémentation qui m'a aidé:

(Notez le mot clé this qui a déjà été mentionné).

    /// <summary>
    /// Convert current bytes to string
    /// </summary>
    /// <param name="bytes">Current byte[]</param>
    /// <returns>String version of current bytes</returns>
    public static string StringValue(this byte[] currentBytes)
    {
        return string.Concat(Array.ConvertAll(bytes, b => b.ToString("X2")));
    }
1
user919426

Pour ceux qui se demandent, j'ai eu le même problème, aucune des réponses n'a fonctionné. Il s’avère que c’est parce que la déclaration using de l’Assemblée avait un alias:

using ex = MyApp.Example

La suppression de l’alias a fonctionné, mais j’ai plutôt décidé d’ajouter une variable using sans alias, qui corrigeait également le problème:

using MyApp.Example
using ex = MyApp.Example
0
CAVX

J'ai eu ce problème en utilisant une méthode d'extension sur des enums dans des solutions référencées les unes aux autres comme indiqué ci-dessous. Intellisense a travaillé pour la méthode d’extension dans le projet ApplicationUI et il s’est même exécuté sans erreur de compilation ni d’erreur d’exécution. Mais la méthode n'a tout simplement pas fonctionné. De plus, la fenêtre immédiate m'a assuré que BusinessObjectLib.MyEnum ne contenait pas de méthode portant le nom de ma méthode d'extension et qu'aucune méthode d'extension ne pouvait être trouvée.

GenericLib - project where extension method on generic enums is defined
BusinessObjectLib - project where enums were defined, references GenericLib
ApplicationUI - project referencing both GenericLib and BusinessObjectLib

Même si l'Explorateur de solutions avait l'air de bien regarder tous les projets d'ApplicationUI, lorsque j'ai ouvert le projet BusinessObjectLib, je pouvais voir que sa référence à GenericLib était rompue pour une raison quelconque. (Comme tout notre code, VS a probablement aussi des bugs?). Tout d'abord, j'ai travaillé dans le projet BusinessObjectLib ouvert directement dans VS, supprimant le ref, puis supprimant le projet, puis les restaurant dans l'ordre inverse. Ensuite, j'ai renommé le fichier ApplicationUI.sou et je l'ai forcé à être reconstruit. J'ai pu résoudre ce problème grâce à ces actions, mais seul le changement de nom du fichier .sou semblait suffire. La fenêtre immédiate toujours continue à me donner la même erreur, mais au moins le code d'exécution fonctionne à nouveau. J'utilise ce modèle exact dans plusieurs autres projets sans avoir le genre de problème que j'ai ici.

0
B H

Dans mon cas, la méthode Extension était dans une référence externe qui faisait référence à une version différente d'un composant. J'ai synchronisé les versions sur les deux projets et cela a fonctionné.

0
Marco Alves