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.
Holy crap! Sembrava davvero fare il trucco, Marc! – Flipster
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
Tornerò e segnerò come risposta accettata se il sito .Net 2.0 non si lamenta di quello Attributo "CompilerVersion". – Flipster