2010-11-12 13 views
5

Questa è una domanda sulla visibilità del metodo di estensione in .Net (in particolare C#) e perché intellisense può funzionare, ma il compilatore non riesce sullo stesso pezzo di codice.. Metodo di estensione Net (questa stringa Foo) Solo parzialmente visibile

Picture questo ...

ho Net 3.5 libreria di classi che consiste di un gruppo di oggetti e di una sola classe Metodi di estensione. Ecco uno dei metodi:

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

Per utilizzare i metodi di estensione all'interno della libreria di classi in sé, ogni classe che richiede uno dei metodi deve specificare:

using MyApp.Extensions; 

Dal momento che è uno spazio dei nomi diverso rispetto al resto della biblioteca. Tutto ciò funziona bene.

Ora, un sito Web .Net 2.0 fa correttamente riferimento a questa libreria e un file di classe desidera utilizzare la libreria. Così dichiara che è:

using MyApp.Extensions 

che sembra funzionare bene, e quando si digita una stringa, IntelliSense non vedere il metodo di estensione penzoloni fuori un'istanza stringa:

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

amo quando un piano si riunisce!

Tuttavia, questa è la fine della gioia.

Quando si tenta di costruire il sito web, la build riesce con il seguente messaggio:

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

Quando si tenta di copiare direttamente la classe ExtensionMethods nel progetto web, la compilazione fallisce di nuovo. Questa volta, perché la parola "questo" non era prevista.

Stranamente, il metodo di estensione funziona come un metodo statico normale:

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

... e Build funziona bene (in modo che il problema non è in realtà con il "questo" parola chiave) . In effetti, la build funziona se la classe ExtensionMethods si trova nella libreria di classi o nel sito web.

In altre parole, questo risolve il problema e la compilazione avrà esito positivo.

... ma la soluzione fa schifo.

Domanda: Esiste una sorta di trucco segreto per far funzionare correttamente i metodi di estensione in questo scenario?

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

ho provato il trucco "System.Runtime.CompilerServices namespace", ma che non sembrano aiutare.

Che cosa potrebbe causare ad Intellisense un metodo di estensione corretto e il compilatore fallire?

Nota: la variabile di esempio inventata avrebbe dovuto essere chiamata "nome" anziché "FirstName", ma si ottiene l'idea.

risposta

3

Nel web.config, prova ad aggiungere al nodo System.Web/pagine/namespace

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

Sarà inoltre necessario per assicurare che il compilatore ASP.NET è in 3.5 modalità:

<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

Holy crap! Sembrava davvero fare il trucco, Marc! – Flipster

+0

Il sito Web di terze parti che utilizzo RICHIEDE che rimanga un sito .Net 2.0. Questo viola questo requisito? (Farò dei test per vedere, ma ho già una risposta alla tua risposta dato che era giusto con i soldi) – Flipster

+0

Tornerò e segnerò come risposta accettata se il sito .Net 2.0 non si lamenta di quello Attributo "CompilerVersion". – Flipster

0

Il sito Web è in esecuzione con .Net 2.0 e non supporta il metodo/classe di estensione. quindi il compilatore .NET 2.0 lo ha trattato come un normale metodo statico. esso verrà compilato in .net 3.5 solo

+0

Bzzzz, risposta errata, è possibile, utilizzando VS2008. Vedi la mia risposta. – leppie

+0

@leppie: qui sito web in esecuzione con VS2005 ... extention class/method only support in .net3.0 + – Harendra

+0

Ma ho detto VS2008 :) – leppie

0

non consiglierei mai mantenere Extension metodi all'interno di qualsiasi namespace.

+0

Perché no? Non "usare * .Extensions" segue esattamente la convenzione quadro .Net? – Flipster

+0

sì, ma solo per la prevenzione della scrittura dell'istruzione 'using' ovunque, tengo la classe estensioni' namespace-less'. –

+0

Suppongo che dipenda da quanto spesso usi le estensioni. Su circa 80 classi, ho bisogno solo delle estensioni in 2 classi, quindi non c'è davvero bisogno di inquinare lo spazio dei nomi degli altri 78. – Flipster

Problemi correlati