Quiero proporcionar a los objetos dentro de una biblioteca de clases la capacidad de "emitir" mensajes sin preocuparse por cómo se está produciendo. La biblioteca de clases se puede usar en una aplicación de consola, una aplicación de Windows WinForm o WPF, o una página web.¿Qué usar? delegar, evento o Func <T>?
Originalmente había decidido que usaría un delegado para manejar esto. Implementé esto usando clases pero al compilador no le gustó el delegado cuando intenté poner al delegado en una interfaz de la que es inherente cada uno de estos objetos.
Descubrí que podía mover al delegado fuera de la interfaz y luego pude compilar, pero no estoy seguro de que esto logre lo que estoy tratando de hacer ... También me parece un error, así que quería preguntar Si alguno de ustedes tiene ideas diferentes para lograr esto ...
La interfaz:
namespace Test
{
using System;
using System.Xml.Linq;
public interface IAction
{
DisplayMessageDelegate DisplayMessage(string message);
void Execute();
XElement Serialize(XName elementName);
}
public delegate void DisplayMessageDelegate(string message);
}
a partir de ahí, no estoy seguro de cómo implementar este comportamiento: (Por cierto, sé que este código no se compilar ...)
public class ActionClass1 : IAction
{
// Other methods not shown...
void Execute()
{
if (this.DisplayMessage != null)
{
this.DisplayMessage(“Hello”);
}
}
}
public class ConsoleClass
{
ActionClass1 class1 = new ActionClass1();
class1.DisplayMessage = { x => Console.WriteLine(x); };
}
public class WinFormClass
{
ActionClass1 class1 = new ActionClass1();
Class1.DisplayMessage = {x => DisplayTextBox.Text = x; };
}
Cabe mencionar que si necesita algo más complicado que params, ref/out ... Acción/Func no funcionará. También otra 'gracia' es que puedes nombrar los parámetros de manera apropiada (intellisense). Dicho esto, también usaría la Acción. –
Jake