Método de extensão .Net (esta string Foo) apenas parcialmente visível
Esta é uma pergunta sobre a visibilidade do método de extensão no .Net (especificamente C #) e por que o intellisense pode funcionar, mas o compilador falha no mesmo trecho de código.
Imagine isso...
Eu tenho .Net 3.5 biblioteca de classes que consiste em um monte de objetos e uma única classe de métodos de extensão. Aqui está um dos métodos:
namespace MyApp.Extensions
{
public static class ExtensionMethods
{
public static string ToTitleCase(this string Origcase)
{ string TitleCase = Origcase;
... implementation ...
return TitleCase;
}
}
Para usar os métodos de extensão na própria biblioteca de classes, cada classe que requer um dos métodos precisa especificar:
using MyApp.Extensions;
Como esse é um espaço para nome diferente do restante da biblioteca. Tudo isso funciona bem.
Agora, um site .Net 2.0 referencia adequadamente essa biblioteca e um arquivo de classe deseja usar a biblioteca. Por isso, declara que é:
using MyApp.Extensions
Isso parece funcionar bem e, ao digitar uma string, o Intellisense vê o método de extensão pendurado em uma instância de string:
http://www.flipscript.com/test/ToTitleCase.jpg
Adoro quando um plano se reúne!
No entanto, esse é o fim da alegria.
Ao tentar compilar o site, a compilação falha com a seguinte mensagem:
http://www.flipscript.com/test/titlecaseerror.jpg
Ao tentar copiar diretamente a classe ExtensionMethods no projeto da Web, a compilação falha novamente. Desta vez, porque a palavra "this" não era esperada.
Curiosamente, o método de extensão funciona como um método estático normal:
http://www.flipscript.com/test/titlecaseok.jpg
... e o Build funciona muito bem (portanto, o problema NÃO é realmente a palavra-chave "this"). De fato, a compilação funciona se a classe ExtensionMethods está na biblioteca de classes ou no site.
Em outras palavras, isso resolve o problema e a compilação será bem-sucedida.
... mas a solução é péssima.
Pergunta: Existe algum tipo de truque secreto para fazer com que os métodos de extensão funcionem corretamente nesse cenário?
http://www.flipscript.com/test/ToTitleCase.jpg
Eu tentei o truque "namespace System.Runtime.CompilerServices", mas isso não pareceu ajudar.
O que faria o Intellisense ver um método de extensão corretamente e o compilador falhar?
Nota: A variável de exemplo artificial deveria ter sido chamada de 'nome' em vez de 'Nome', mas você entendeu.