Используйте общедоступный атрибут в статическом методе на c#

#c#

#c#

Вопрос:

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

Структура реализации плагина такова:

Плагин использует структуру

Проблема заключается в вызываемом методе TestMethod в TestClass классе. Я не могу использовать атрибут TestPlugin , потому что он не является статическим свойством.

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

Код выглядит следующим образом:

TestPlugin объявление:

 [ImportMany]
public IEnumerable<ITestPlugin> TestPlugin{ get; private set;}
  

Использование TestPlugin атрибута:

 private static void TestMethod(){
    ...
    // Here Visual Studio says that :
    //An object reference is required for the nonstatic field, method, or property 'ToastPlugin'
    foreach(plugin in TestPlugin){
       //Plugin's use
    }
    ...
}
  

Редактировать:

Есть ли способ использовать TestPlugin inside of TestMethod без объявления TestPlugin как static по причинам, указанным ранее?

Комментарии:

1. В чем ваш вопрос?

2. Если бы у вас было два разных экземпляра TestClass , один с двумя плагинами и один с одним плагином, что бы вы ожидали TestMethod сделать? (Я бы также назвал TestPlugin его свойством, а не атрибутом — ImportMany это пример атрибута здесь, в терминологии C #.)

Ответ №1:

Есть ли способ использовать TestPlugin внутри TestMethod без объявления TestPlugin как static по причинам, указанным ранее?

Быстрый ответ — нет.

В основном у вас есть следующие варианты:

  1. TestPlugin Также сделайте статический.
  2. Сделайте TestMethod так, чтобы он не был статичным.
  3. Make TestMethod принимает ссылку на TestClass объект в качестве параметра.
  4. Добавьте статическую коллекцию IList<IEnumerable<ITestPlugin>> и в get / set методы TestPlugin добавления / удаления класса из этой новой коллекции.

Какой из этих четырех вы бы выбрали, зависит от того, чего именно вы пытаетесь достичь.