2010-11-12 6 views
5

Il s'agit d'une question sur la visibilité de la méthode d'extension dans .Net (en particulier C#), et pourquoi intellisense peut fonctionner, mais le compilateur échoue sur le même morceau de code.. Méthode d'extension .Net (cette chaîne Foo) Seulement partiellement visible

Imaginez ...

Je .Net 3.5 bibliothèque de classes composée d'un groupe d'objets et une seule classe Méthodes d'extension. Voici l'une des méthodes suivantes:

namespace MyApp.Extensions 
{ 
    public static class ExtensionMethods 
    { 
     public static string ToTitleCase(this string Origcase) 
     { string TitleCase = Origcase; 
      ... implementation ... 
      return TitleCase; 
     } 
    } 

Pour utiliser les méthodes d'extension dans la bibliothèque de classe elle-même, chaque classe qui nécessite l'une des méthodes doit préciser:

using MyApp.Extensions; 

Depuis est un espace de noms différent que le reste de la bibliothèque. Tout cela fonctionne bien.

Maintenant, un site Web .NET 2.0 référence correctement cette bibliothèque, et un fichier de classe souhaite utiliser la bibliothèque. Ainsi, il déclare qu'il est:

using MyApp.Extensions 

qui semble fonctionner très bien, et lorsque vous tapez une chaîne, IntelliSense ne voit la méthode d'extension ballants hors d'une instance de chaîne:

http://www.flipscript.com/test/ToTitleCase.jpg

J'adore quand un plan arrive ensemble!

Cependant, c'est la fin de la joie.

Lorsque vous essayez de construire le site Web, la génération échoue avec le message suivant:

http://www.flipscript.com/test/titlecaseerror.jpg

Lorsque vous essayez de copier directement la classe ExtensionMethods dans le projet Web, la génération échoue à nouveau. Cette fois, parce que le mot "ceci" n'était pas attendu.

Bizarrement, la méthode d'extension ne fonctionne comme une méthode statique normale:

http://www.flipscript.com/test/titlecaseok.jpg

... et la construction fonctionne très bien (si le problème est pas vraiment avec le mot-clé « this ») . En fait, la construction fonctionne que la classe ExtensionMethods se trouve dans la bibliothèque de classes ou sur le site Web. En d'autres termes, cela résout le problème et la génération réussit.

... mais la solution craint. Question: Y a-t-il une sorte d'astuce secrète pour que les méthodes d'extension fonctionnent correctement dans ce scénario?

http://www.flipscript.com/test/ToTitleCase.jpg

J'ai essayé le truc « espace de noms System.Runtime.CompilerServices », mais cela ne semble pas aider.

Qu'est-ce qui provoquerait Intellisense à voir une méthode d'extension correctement et le compilateur à échouer?

Remarque: La variable d'exemple artificielle aurait dû s'appeler 'nom' au lieu de 'Prénom', mais vous en avez l'idée.

Répondre

3

En web.config, essayez d'ajouter au System.Web/pages/nœud namespaces

<system.web> 
    .... 
    <pages ....> 
     .... 
     <namespaces> 
      .... 
      <add namespace="MyApp.Extensions" /> 

Vous devez également vous assurer que le compilateur ASP.NET est en 3.5 Mode:

<system.codedom> 
    <compilers> 
    <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" 
       type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <providerOption name="CompilerVersion" value="v3.5"/> 
     <providerOption name="WarnAsError" value="false"/> 
    </compiler> 
</compilers> 
</system.codedom> 
+0

Des conneries! Cela semblait faire l'affaire, Marc! – Flipster

+0

Le site Web de tiers que j'utilise REQUIERT qu'il demeure un site .Net 2.0. Est-ce que cela viole cette exigence? (Je vais faire quelques tests pour voir, mais je vais bosse votre réponse déjà car il était juste sur l'argent) – Flipster

+0

Je reviendrai et marquer cette réponse comme acceptée si le site .Net 2.0 ne se plaint pas de cela Attribut "CompilerVersion". – Flipster

0

Votre site Web fonctionne avec .Net 2.0 et ne prend pas en charge la méthode/classe d'extension. Ainsi, le compilateur .NET 2.0 l'a traité comme une méthode statique normale. il compilera dans .NET 3.5 ne

+0

Bzzzz, mauvaise réponse, c'est possible, en utilisant VS2008. Vois ma réponse. – leppie

+0

@leppie: ici site web fonctionnant avec VS2005 ... extension classe/méthode support uniquement en .net3.0 + – Harendra

+0

Mais j'ai dit VS2008 :) – leppie

0

je recommanderais jamais garder Extension méthodes à l'intérieur toute namespace.

+0

Pourquoi pas? Est-ce que "using * .Extensions" ne suit pas exactement la convention de framework .Net? – Flipster

+0

oui c'est le cas, mais juste pour prévenir l'écriture de l'instruction 'using' partout, je garde sa classe d'extensions' namespace-less'. –

+0

Je suppose que cela dépend de la fréquence à laquelle vous utilisez les extensions. Sur environ 80 classes, j'ai seulement besoin des extensions dans 2 classes, donc il n'y a vraiment pas besoin de polluer l'espace de noms de l'autre 78. – Flipster

Questions connexes