Методы расширения не распознаны - PullRequest
44 голосов
/ 07 апреля 2010

Что необходимо для соблюдения метода расширения, если он существует в импортированной сборке? Я построил один в проекте библиотеки классов, но он не распознается в моем веб-проекте, который ссылается на библиотеку. Все остальные классы и методы в библиотеке соблюдаются и видны, но этот метод расширения - нет. Метод расширения виден при использовании в библиотеке.

Ответы [ 10 ]

59 голосов
/ 07 апреля 2010

Ссылка на сборку, содержащую класс с методами расширения, недостаточна. Вам необходимо импортировать пространство имен, содержащее класс в каждом из вашего исходного файла, где вы хотите использовать методы расширения.

Например, чтобы использовать LINQ-to-objects, необходимо сослаться на сборку System.Core и импортировать пространство имен System.Linq (которое содержит класс Enumerable с Методы расширения LINQ):

using System.Linq;
17 голосов
/ 07 апреля 2010

Вы уверены, что метод расширения опубликован?

14 голосов
/ 30 мая 2013

Если метод Extension вызывается, когда не используется синтаксис расширения, используйте формат:

this.MyExtensionMethod()

Это решило мою проблему с отсутствием метода расширения класса в VS2010.

2 голосов
/ 20 октября 2016

Для тех, кто приземляется здесь, имея ту же проблему в VB.NET, обратите внимание, что не только метод расширения, но и сам модуль должен быть помечен как Public, иначе вы получитеэта ошибка.Это относится, по крайней мере, к сообществу VS2015 и, скорее всего, так будет и в других версиях.

0 голосов
/ 04 июня 2019

Вы должны быть осторожны с сигнатурой метода

public static ILoggingBuilder AddCustomizedLogging (этот конструктор ILoggingBuilder, строка appInsightsKey)

модификатор "this" требуется для методов расширения

0 голосов
/ 06 июня 2017

Убедитесь, что при использовании шаблонов объявление вашего шаблона соответствует тому, что объявлено в сигнатуре метода, с помощью "this" ..

Итак,

SomeClass<string, string> test = new SomeClass<string, string>();

extensionMethod<key, val>(this SomeClass<key, Lazy<val>>, string val)
{
}

метод расширения не будет отображаться из-за отложенной оболочки.

0 голосов
/ 22 марта 2017

В моем случае метод Extension был во внешней ссылке, которая ссылалась на другую версию компонента. Я синхронизировал версии на обоих проектах, и это сработало.

0 голосов
/ 04 августа 2016

У меня была эта проблема с использованием метода расширения для перечислений в решениях, на которые ссылаются друг друга, как показано ниже. Intellisense работал для метода расширения в проекте ApplicationUI и даже работал без ошибок компиляции или времени выполнения. Но метод просто не работал. Кроме того, немедленное окно заверило меня, что BusinessObjectLib.MyEnum не содержит метод с именем моего метода расширения, и метод расширения не может быть найден.

GenericLib - project where extension method on generic enums is defined
BusinessObjectLib - project where enums were defined, references GenericLib
ApplicationUI - project referencing both GenericLib and BusinessObjectLib

Несмотря на то, что обозреватель решений выглядел нормально, просматривая все проекты из ApplicationUI, когда я открыл проект BusinessObjectLib, я увидел, что его ссылка на GenericLib почему-то не работает. (Как и весь наш код, VS, вероятно, также имеет ошибки?). Сначала я работал в проекте BusinessObjectLib, открытом непосредственно в VS, удаляя ссылку, затем удаляя проект, затем восстанавливая оба в обратном порядке. Затем я переименовал файл ApplicationUI.sou и заставил его восстановить. Я смог решить эту проблему с помощью этих действий, но, похоже, только переименование файла .sou помогло. Непосредственное окно все еще продолжает выдавать мне ту же ошибку, но по крайней мере код времени выполнения снова работает. Я использую этот точный шаблон в нескольких других проектах, и у меня нет таких проблем.

0 голосов
/ 15 февраля 2016

Для всех, кто интересуется, у меня была такая же проблема, ни один из ответов не сработал. Оказывается, это потому что псевдоним оператора using:

using ex = MyApp.Example

Удаление псевдонима сработало, но я решил вместо этого добавить дубликат без псевдонима using, что также решило проблему:

using MyApp.Example
using ex = MyApp.Example
0 голосов
/ 18 марта 2015

Для примера реализации, которая помогла мне:

(обратите внимание на ключевое слово this, которое уже было упомянуто).

    /// <summary>
    /// Convert current bytes to string
    /// </summary>
    /// <param name="bytes">Current byte[]</param>
    /// <returns>String version of current bytes</returns>
    public static string StringValue(this byte[] currentBytes)
    {
        return string.Concat(Array.ConvertAll(bytes, b => b.ToString("X2")));
    }
...