Hallo,
meine Lösung läuft zwar, aber ich kenne mich nicht so richtig aus und würde gerne zwei Sachen wissen.
a) Ist die Umsetzung so richtig, gehe ich richtig vor? Ich habe noch nicht so viel Erfahrung mit Events und / oder Delegates
b) Wie kann ich in der Impl-Klasse beim Invoke verhindern, dass eine Dummy-Methode aufgerufen, bzw. registriert wird, die wäre in meinem Fall unnütz.
OK, hier der Sachverhalt
namespace Betfair.MarketMonitor {
/// <summary>
/// Delegate for a change on an exchange market
/// </summary>
/// <param name="exchangeMarket">The ExchangeMarket object</param>
public delegate void OnChange(ExchangeMarket exchangeMarket);
interface IMarketMonitor {
/// <summary>
/// Event will be raised after any change on the ExchangeMarket object
/// </summary>
event OnChange OnChange_Event;
void Process();
}
}
namespace Betfair.MarketMonitor {
/// <summary>
/// Watches markets from the betfair web site
/// </summary>
class ExternMarketMonitor : IMarketMonitor {
private long marketId = long.MinValue;
// All available events
public event OnChange OnChange_Event;
/// <summary>
/// Public constructor
/// </summary>
/// <param name="marketId">The market id</param>
public ExternMarketMonitor(long marketId) {
this.marketId = marketId;
// ????????????????????????
this.OnChange_Event += new OnChange(TestImpl);
// ????????????????????????
}
public void TestImpl(ExchangeMarket exchangeMarket) {
// Why this empty method ???
}
public void Process() {
this.OnChange_Event.Invoke(null);
}
}
}
static void Main() {
try {
IMarketMonitor marketMonitor = new ExternMarketMonitor(234);
marketMonitor.OnChange_Event += new OnChange(TestExtern);
marketMonitor.Process();
So, das funktioniert wunderbar, die Methode TestExtern wird aufgerufen, nur möchte ich noch viele Ereignisse einbauen, muss ich da jedesmal so eine "Pseudozuweisung" (this.OnChange_Event += new OnChange(TestImpl);
) machen und jedesmal eine leere Methode schreiben? Geht das nicht einfacher .. kann man anstatt des Invoke auch etwas anderes verwenden, denn die "Kette" der Methoden besteht eigentlich immer aus einer Methode und nicht wie in dem Beispiel aus zwei Methoden, wobei eine einfach nur eine Hülle ist.
Danke schon mal für Hilfe. Ich hoffe, dass ich mein Problem einigermaßen verständlich rübergebracht habe.
Morgen,
Dein Vorgehen ist falsch. Es gibt einen Dokumentation in der MSDN, ich bin aber zu faul den Link zu suchen, also hier der Code 😁 :
public class ChangeEventArgs : EventArgs // Entspricht deiner "ExchangeMarket"-Klasse
{...}
public delegate void ChangeEventHandler(object sender, ChangeEventArgs e);
public interface IMarketMonitor
{
event ChangeEventHandler Changed;
}
public class MarketMonitor
{
public event ChangeEventHandler Changed;
protected virtual OnChanged(ChangeEventArgs e)
{
if(this.Changed!=null)
{
this.Changed(this,e);
}
}
public void Prozess()
{
this.OnChanged(new ChangeEventArgs(...));
}
}
Du solltest mal die MSDN-Sektion über Bennenungsrichtlinien lesen.
Gruß
Juy Juka
@JuyJuka, @herbivore,
vielen Dank für eure Antworten, werde ich gleich umbauen. Super Forum hier 👍