Programuji si knihovnu pro aplikaci. Mám v ní uložené interface tříd, které aplikace obsahuje, tj. hlavně interface pro Controller. Ve třídě Controller jsou tři eventy (jejichž delegáti jsou deklarováni v knihovně) a metody, kterým předávám argumenty eventů. Bez problému eventy přiřadím, ale při jejich použití už nastává chyba. Více snad poví kód. Předem děkuji za každou radu.
Soubor s interface Controlleru v knihovně
/// <summary>
/// Argumenty eventu
/// </summary>
public class MessageEventArgs : EventArgs
{
...
}
/// <summary>
/// Argumenty eventu
/// </summary>
public class SystemMessageEventArgs : EventArgs
{
...
}
/// <summary>
/// Argumenty eventu
/// </summary>
public class ContactListEventArgs : EventArgs
{
...
}
/// <summary>
/// Delegát pro zpracování klientských zpráv
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void MessageTo(Object sender, MessageEventArgs args);
/// <summary>
/// Delegát pro event systémové zprávy
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void SystemMessageTo(Object sender, SystemMessageEventArgs args);
/// <summary>
/// Delegát event ContactListu
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void ContactListTo(Object sender, ContactListEventArgs args);
/// <summary>
/// Controller pro klientskou aplikaci
/// </summary>
public interface IClientController
{
/// <summary>
/// Eventhandler na okno zpráv
/// </summary>
event MessageTo MessageRedirect;
/// <summary>
/// Eventhandler pro systémové zprávy
/// </summary>
event SystemMessageTo SystemMessageRedirect;
/// <summary>
/// Eventhandler pro kontakt list
/// </summary>
event ContactListTo ContactListRedirect;
/// <summary>
/// Metoda vrací instanci třídy Server pro komunikaci se serverem
/// </summary>
IServer Server { get; }
/// <summary>
/// Metoda pro handlování příchozí systémové zprávy, kterou zaslal
/// server.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void SystemMessageHandler(Object sender, SystemMessageEventArgs args);
/// <summary>
/// Metoda pro handlování příchozích zpráv od serveru, které zaslal
/// nějaký klient.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void MessageHandler(Object sender, MessageEventArgs args);
/// <summary>
/// Metoda pro handlování contact listu
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void ContactListHandler(Object sender, ContactListEventArgs args);
}
Další soubor knihovny
public class ClientLoginStatus : IPacketReadable
{
private IClientController Controller;
public ClientLoginStatus(..., IClientController controller)
{
...
this.Controller = controller;
}
public void Run()
{
...
Controller.ContactListRedirect += new ContactListTo(Controller.ContactListHandler);
Controller.MessageRedirect += new MessageTo(Controller.MessageHandler);
Controller.SystemMessageRedirect += new SystemMessageTo(Controller.SystemMessageHandler);
}
}
}
A nyní chybka v nemožnosti použít event v třídě podobné výše zmiňované, která je taktéž v knihovně. Chyba je: The event '...IClientController.SystemMessageRedirect' can only appear on the left hand side of += or -=
public class ClientSystemMessage : IPacketReadable
{
private String Data;
private IClientController Controller;
public ClientSystemMessage(..., IClientController controller)
{
...
this.Controller = controller;
}
public void Run()
{
...
SystemMessageEventArgs Arguments = new SystemMessageEventArgs(Data);
Controller.SystemMessageRedirect(this, Arguments); // Zde chyba
}
}