Что необходимо для выполнения метода расширения, когда он существует в импортированной сборке? Я построил один в проекте библиотеки классов, но он не распознается в моем веб-проекте, который ссылается на библиотеку. Все остальные классы и методы в библиотеке выполнены и видны, но этот метод расширения не является. Метод расширения отображается при использовании в библиотеке.
Методы расширения не распознаны
Ответ 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" необходим для методов расширения