Se requiere una referencia de objeto para acceder a un miembro no estático

Tengo un temporizador y quiero poner las devoluciones de llamada del temporizador en funciones separadas, sin embargo, obtengo este error.

Se requiere una referencia de objeto para acceder al campo no estático, método o propiedad ” …

Si declaro estas devoluciones de llamada como eventos delegates y variables miembro como estáticos, funciona bien. ¿Debo dejarlo así?

class MainClass { private Timer _timer = null; private TimeSpan _millisecs; public static void Main (string[] args) { Application.Init(); MainWindow win = new MainWindow(); Label lbl = new Label(); lbl.Text = "00:00"; Table tbl = new Table(2, 2, true); tbl.Name = "tbl"; Button btn = new Button("Start"); tbl.Attach(lbl, 0, 2, 0, 1); tbl.Attach(btn, 0, 1, 1, 2); Button btn_stop = new Button("Stop"); tbl.Attach(btn_stop, 1, 2, 1, 2); btn.Clicked += StartClick; btn_stop.Clicked += StopClick; win.Add(tbl); win.ShowAll(); Application.Run (); } private void StartClick(object obj, EventArgs args) { if (_timer == null) { _timer = new Timer(); _timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { _millisecs = _millisecs.Add(new TimeSpan(0, 0, 0, 0, 50)); lbl.Text = new DateTime(_millisecs.Ticks).ToString("ss:ff"); }; _timer.Interval = 50; _timer.Enabled = true; } _timer.Start(); } private void StopClick(object obj, EventArgs args) { _timer.Stop(); } } 

Depende de lo que trates de hacer. Puede hacer cosas estáticas o puede crear una instancia:

 MainClass instance = new MainClass(); btn.Clicked += instance.StartClick; btn_stop.Clicked += instance.StopClick; 

Supongo que esta no es su aplicación real , por lo que es difícil decir lo que debe hacer en su código real. Personalmente me inclino por crear una instancia: las variables estáticas representan el estado global, que generalmente es una mala idea (en términos de capacidad de prueba, etc.). Sin embargo, no podemos decir si eso afecta su situación o no.

Lo importante es que entiendas por qué recibes el mensaje de error y por qué el cambio anterior lo soluciona. Una vez que comprenda eso, estará en una mejor situación para tomar las mejores decisiones.

Es porque está accediendo a métodos no estáticos desde la estática en este caso.

Cree el objeto de la clase y luego llame al método

 ObjectOfClass obj = new ObjectOfClass(); obj.MethodName(); 

entonces en tu caso

 MainClass obj = new MainClass(); btn.Clicked += obj.StartClick; btn_stop.Clicked += obj.StopClick; 

O crea los métodos llamados como estáticos (que ya probaste como dijiste).