Подтвердить что ты не робот

Методы расширения не распознаны

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

4b9b3361

Ответ 1

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

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

using System.Linq;

Ответ 2

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

Ответ 3

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

this.MyExtensionMethod()

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

Ответ 4

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

Ответ 5

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

(Обратите внимание на ключевое слово 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")));
    }

Ответ 6

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

using ex = MyApp.Example

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

using MyApp.Example
using ex = MyApp.Example

Ответ 7

У меня возникла эта проблема, используя метод расширения для перечислений в решениях, на которые ссылаются друг на друга, как показано ниже. 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

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

Ответ 8

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

Ответ 9

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

Итак,

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

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

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

Ответ 10

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

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

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