.Net Extension Method (this string Foo) Only partial Visible

Это вопрос о методе расширения видимость в. Net (в частности, C #), и почему intellisense может работать, но компилятор не работает с тем же фрагментом кода.

Представьте себе это ...

У меня есть библиотека классов .Net 3.5, состоящая из группы объектов и одного Класс методов расширения. Вот один из методов:

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

Чтобы использовать методы расширения в самой библиотеке классов, каждый класс, которому требуется один из методов, должен указать:

using MyApp.Extensions;

Поскольку это пространство имен отличается от остальной части библиотеки. Все это работает нормально.

Теперь веб-сайт .Net 2.0 правильно ссылается на эту библиотеку, и файл класса хочет использовать библиотеку. Таким образом, он заявляет, что это:

using MyApp.Extensions

Это КАЖЕТСЯ работать нормально, и при вводе строки Intellisense видит, что метод расширения свисает с экземпляра строки:

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

Мне нравится, когда план слагается!

Однако это конец радости.

При попытке построить веб-сайт сборка завершается ошибкой со следующим сообщением:

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

При попытке напрямую скопировать класс ExtensionMethods в веб-проект сборка снова завершается ошибкой. На этот раз, потому что слово «это» не ожидалось.

Как ни странно, метод расширения действительно работает как обычный статический метод:

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

... и сборка работает нормально (так что проблема НЕ в ключевом слове "this"). Фактически, сборка работает независимо от того, находится ли класс ExtensionMethods в библиотеке классов или на веб-сайте.

Другими словами, это решает проблему, и сборка будет успешной.

... но решение отстой.

Вопрос: Есть ли какой-то секретный трюк, чтобы заставить методы расширения работать правильно в этом сценарии?

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

Я пробовал пространство имен System.Runtime. CompilerServices ", но, похоже, это не помогло.

Что могло заставить Intellisense правильно видеть метод расширения и отказывать компилятору?

Примечание: надуманная переменная примера должна была называться" имя "вместо "FirstName", но идею вы поняли.

5
задан Flipster 12 November 2010 в 06:00
поделиться