Member 14137614 Ответов: 3

Как заставить код, работающий в приложении формы, работать в консольном приложении?


У меня есть код, который работает в приложении формы. Я перенес код в консольное приложение, чтобы сделать несколько анализов, и сделал все исправления для ввода переменных, которые пришли из элементов управления формой. Весь код работает в консольном приложении, за исключением того, который связан с обработчиком событий. В приведенном ниже коде я получаю следующие 2 ошибки в показанных местах:
Ошибка 1: CS0120 ссылка на объект требуется для программы нестатического поля, метода или свойства.OnIterationEvent'
Ошибка 2: CS0026 Ключевое слово 'это' не является допустимым в статическое свойство, статический метод и статический инициализатор

Я не смог найти ничего, что помогло бы мне с помощью поиска в Google. Почему обработчик событий должен работать в приложении формы, но не в консольном приложении? Любая помощь очень ценится.

Что я уже пробовал:

У меня есть следующий отдельный класс:
IterationEventArgs Класс.в CS
// обычные операторы "using"
namespace Limits
{
    class IterationEventArgs : EventArgs
    {
        public int IterationNumber { get; set; }

        public IterationEventArgs(int aNumber)
        {
            IterationNumber = aNumber;
        }
    }
}


Основная программа включает в себя следующее:

// нормальным "использованием" отчетность плюс:
// С или без 'public delegate void EventHandler();'

namespace Limits
{
   Class Program
   {
      public event EventHandler<IterationEventArgs> OnRaiseIterationEvent;
      static void Main(string[] args)
      {
         // code
         void RaiseIterationEvent(int iterationNumber)
         {
            if (OnRaiseIterationEvent != null) // Error 1
                OnRaiseIterationEvent(this, new iterationEventArgs(iterationNumber)); //Error 1, 2
            else
                return;
         }
      }
   }
}
У меня есть метод внутри основного метода, который вызывает метод RaiseIterationEvent
внутри цикла for с использованием:

RaiseIterationEvent(iterationNumber1);

3 Ответов

Рейтинг:
2

OriginalGriff

Самый простой способ-помнить, что форма-это класс, хотя и с дополнительными свойствами и методами.

Поэтому возьмите свой код на основе формы и поместите все это в класс, а затем создайте экземпляр этого класса в своем классе. Main метод и использовать все это аналогичным образом - но передавая необходимые ему параметры вместо того, чтобы извлекать их из текстовых полей.
Есть гораздо меньше изменений, связанных с попыткой принудить код к статическому контексту - и поскольку вы написали код на основе форм, вы уже понимаете, как он работает, так что он должен быть довольно тривиальным, да?


Рейтинг:
2

Gerry Schmitz

Если вы не обрабатываете "отправитель", который обычно является первым параметром в сигнатуре обработчика событий, то просто передайте "null" (вместо того, что вы пытаетесь).

Вы можете передать все, что хотите; вы не ограничены "настоящим" "отправителем".


Рейтинг:
1

raddevus

Обратите внимание, что основной метод помечен как статический

static void Main(string[] args)


Первоначальная проблема заключается в том, что EventHandler, который вы пытаетесь использовать, нестатичен.
public event EventHandler<IterationEventArgs> OnRaiseIterationEvent;


Статический метод Main () не может получить доступ к нестатическому члену OnRaiseIterationEvent.

Вы мочь будьте в состоянии исправить это, просто сделав элемент статичным.
static event EventHandler<IterationEventArgs> OnRaiseIterationEvent;


Но это может иметь и другие последствия.

Ваша вторая ошибка вызвана тем, что ваш статический метод не имеет понятия о this переменная. это доступно только для объектов экземпляра (нестатических).


BillWoodruff

+5