Метод расширения .Net (эта строка Foo) только частично видимый - PullRequest
5 голосов
/ 12 ноября 2010

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

Изобразите это ...

У меня есть библиотека классов .Net 3.5, состоящая из нескольких объектов и одного класса Extension Methods.Вот один из методов:

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

, что SEEMS работает нормально, и при вводе строки Intellisense действительно видит метод расширения, свисающий с экземпляра строки:

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

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

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

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

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

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

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

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

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

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

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

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

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

У меня естьпопробовал трюк "namespace System.Runtime.CompilerServices", но это, похоже, не помогло.

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

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

Ответы [ 3 ]

3 голосов
/ 12 ноября 2010

В файле web.config попробуйте добавить в узел system.web / pages / namespaces

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

Также необходимо убедиться, что компилятор ASP.NET находится в режиме 3.5:

<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 голосов
/ 12 ноября 2010

Я бы никогда не рекомендовал хранить Extension методы внутри любых namespace.

0 голосов
/ 12 ноября 2010

Ваш веб-сайт работает с .Net 2.0 и не поддерживает метод / класс расширения. поэтому компилятор .NET 2.0 рассматривал это как обычный статический метод. он будет компилироваться только в .net 3.5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...