Het lijkt me dat je gewoon een eigen event dient aan te maken en deze af te vuren indien nodig. De rest van de code is perfect overdraagbaar naar c#.
Om een event in c# af te vuren heb je een aantal dingen nodig.
Ten eerste heb je een delegate nodig. Ik ga je de theoretische achtergrond besparen. Ga er maar vanuit dat dit een managed pointer is (een gegevenstype dat rechtstreeks naar een andere waarde verwijst.)
Deze dient je buiten je klasse te instantiëren en kan je vrij een naam geven.
Visual Basic code: public delegate void AnyEventHandler(Any obj, AnyEventArgs e);
In bovenstaand voorbeeld zie je zo een delegate. In deze definitie wordt aangegeven dat de delegate een object Any verwacht en een object AnyEventArgs. Any verwijst hier naar het object dat het event afvuurt (de sender) terwijl AnyEventArgs een klasse is die met het event wordt meegestuurd. Deze klasse bevat data die belangrijk is voor het type event. (In jou geval bv. een string.) Deze objecten worden de definitie van de delegate genoemd.
Andere mogelijke definities zouden kunnen zijn:
Visual Basic code: public delegate void AnyEventHandler(EventArgs e);
Geen sender object en een standaard eventArgs object
Visual Basic code: public delegate void AnyEventHandler;
Helemaal geen objecten
In dit voorbeeld volgen we de eerste definitie. (met sender en AnyEventArgs)
Als tweede gaan we AnyEventArgs klasse aanmaken. Dit is een gewone klasse die er zo zou kunnen uitzien:
Visual Basic code: public class AnyEventArgs { public String Woord{ get; set; }
public AnyEventArgs() {} public AnyEventArgs(String woord) { this.Woord = woord; }
}
Dit is een vrij eenvoudige klasse die één property heeft die via de property geset kan worden of via de constructor. Dit is de EventArgs klasse die we met het event gaan meesturen. Ook dit dient buiten de main klasse (die het event oproept) geplaatst te worden.
De volgende stap is de main klasse zelf. Hierin zijn 3 dingen belangrijk:
1. De declaratie van het event op basis van de aangemaakte delegate. We haken het event als het ware aan de delegate.
2. De constructie van het event
3. Het oproepen van het event.
- Event aanmaken en initialiseren
Visual Basic code: public event AnyEventHandler myEventHandler= null;
- Constructie van het event. Dit is technisch gezien niet nodig maar wordt door MS aangeraden om te doen. Je zou in principe het event rechtstreeks kunnen oproepen maar we kunnen dit beter wrappen in een gecontroleerde omgeving.
Visual Basic code: protected void OnAnyEvent(AnyEventArgs e) { if (myEventHandler!= null) { myEventHandler(this,e); } }
- Als laatste kunnen we nu ons event oproepen indien dit nodig is:
Visual Basic code: public void DoRandomFunction(){ OnAnyEvent(new AnyEventArgs("stringDieMeeMoetMetEvent")); }
In de klasse waar je dit event wil gebruiken kan je naar dit event luisteren door het volgende:
Visual Basic code:
private void Init() { Any any = new Any(); any.myEventHandler += new AnyEventHandler(AnyListener); }
private void AnyListener(Any sender,AnyEventArgs e) { Console.WriteLine(e.Naam); }
De volledige constructie ziet er dan (samengevat) uit als volgt:
Visual Basic code: //Delegate waaraan we het event hooken public delegate void AnyEventHandler(Any obj, AnyEventArgs e);
class Any {
//Event aanmaken (instantie van de delegate public event AnyEventHandler myEventHandler= null; //Event call wrappen (MS practice) protected void OnAnyEvent(AnyEventArgs e) { if (myEventHandler!= null) { myEventHandler(this,e); } }
//Functie waarin we als voorbeeld het event oproepen public void DoRandomFunction() { OnAnyEvent(new AnyEventArgs("stringDieMeeMoetMetEvent")); } }
//Event argumenten klasse, die in dit geval eens string bevat. public class AnyEventArgs { public String Woord{ get; set; }
public AnyEventArgs() {} public AnyEventArgs(String woord) { this.Woord = woord; }
}
Excuses voor eventuele schrijffouten of compileerfouten. Ik heb het niet kunnen testen (zit momenteel op Linux) maar het principe is wel correct. Mocht een andere mod of lid van dit forum de code snel even kunnen testen zou ik dit ten zeerste appreciëren.
Succes |