Laden...

mehrere instanzen einer klasse, welche instanz feuert event?

Erstellt von Afrokalypse vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.471 Views
A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 15 Jahren
mehrere instanzen einer klasse, welche instanz feuert event?

hi zusammen 😃

ich habe eine dll auf die ich zugreife. diese enthält eine klasse myclass.
in einer schleife erzeuge ich nun mehrere instanzen dieser klasse und weise mit


myclass.onevent+= new myclass_onevent(methode);

myclass_onevent(andere klasse k)
{

}

jeder instanz ein event zu. alle instanzen reagieren nun auf ein event. wie kriege ich nun heraus, von welcher instanz das event aktuell angesteuert wird?

ich hoffe das war verständlich 😃

dank und gruß
afr0

Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

4.221 Beiträge seit 2005
vor 15 Jahren

Wenn es ein Event nach MS-Spezifikation ist, dann kriegst Du im Event den sender... diesen kannst Du auswerten und schon weisst Du wer den Event ausgelöst hat.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
194 Beiträge seit 2008
vor 15 Jahren

Eigentlich gehört zu einem Event auch immer ein Parameter vom Typ Object, der den Sender angibt:

private void MeinEvent(object sender, EventArgs e)

Das kannst du dann nach deinem Klassentyp casten.
<Edit>siehe Programmierhans</Edit>

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 15 Jahren

als objekt wird nur eine andere klasse übergeben. deshalb komme ich hier gerade nicht weiter... 😦

einzige möglichkeit die ich momentan sehe, ist, dass ich x einzelne instanzen anlege
also newclass instanz1 = new newclass
newclass instanz2 = ....

und jeder instanz nen eigenes event zuweise.
ist aber keine schöne lösung....

Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

Gelöschter Account
vor 15 Jahren

über den callstack kannst du es auch herausfinden aber das ist auch keine schöne lösung.

4.221 Beiträge seit 2005
vor 15 Jahren

Wo ist denn nun dein Problem ?

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 15 Jahren

mein problem ist folgendes:
ich erstelle ca 30 instanzen dieser klasse. jede instanz reagiert auf das event.
wenn das event gefeuert wird, wird als parameter eine andere klasse erzeugt über die ich infos bekomme. nun muss ich wissen welche info zu welcher übergeordneten klasse gehört.

also ich habe myclass mit dem event

und ich habe anotherclass mit den infos.

anotherclass kann nun durch myclass1 oder auch durch myclass20 erzeugt worden sein... das weiß ich aber nicht.

und ich möchte nur ungern 30 instanzen der klasse manuell anlegen...
ich dachte es gibt da vllt ne möglichkeit das zu umgehen 😃
in vb zum beispiel kann man klassen indizieren indem man ein array anlegt. dann kann man dem event den index aus dem array zuweisen. soweit ich weiß gibts sowas aber nicht in c# oder?

Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

M
194 Beiträge seit 2008
vor 15 Jahren

Sourcecode wäre sicher hilfreich

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

4.221 Beiträge seit 2005
vor 15 Jahren

Leg doch die Instanzen in Dictionaries ab...

Dictionary<Event-Werfendes-Teil, Klasse die Du dann suchst>

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Gelöschter Account
vor 15 Jahren

´kannst du die signatur des eventdelegaten ändern?

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 15 Jahren

aufs delegate kann ich nicht zugreifen, da ich aus ner dll eines fremdanbieters zugreife...

danke 😃 die infos haben mir schon gereicht.
code kann ich momentan leider nicht liefern... aber ich denke dictionary wird das sein was ich brauche.

Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

1.378 Beiträge seit 2006
vor 15 Jahren

Hier ein kleines Beispiel dazu, wenn ich das Problem richtig verstanden habe.


{
	public class Program
	{
		static void Main(string[] args)
		{
			List<MyClass> classes = new List<MyClass>();
			for (int i = 0; i < 10; i++)
			{
				MyClass c = new MyClass { Nr = i };
				c.MyEvent += () => MyClassEvent(c);
				classes.Add(c);
			}

			foreach (var c in classes)
			{
				Console.WriteLine("Raising MyClassEvent Nr:{0}", c.Nr);
				c.RaiseEvent();
			}
		}
		static void MyClassEvent(MyClass myClass)
		{
			Console.WriteLine("MyClassEvent Nr:{0} fired", myClass.Nr);
		}
	}

	public delegate void MyEventHandler();
	public class MyClass
	{
		public int Nr { get; set; }

		public event MyEventHandler MyEvent;

		public void RaiseEvent()
		{
			if (MyEvent != null)
				MyEvent();
		}
	}

Lg XXX

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Afrokalypse,

so ganz genau habe ich es nicht verstanden, aber wenn sender nicht ist, was du suchst, dann müsste this sein, was du suchst. Sender ist das Objekt, das den Event feuert, this ist das Objekt, das den Event abonniert hat. Was anderes braucht man eigentlich nie.

herbivore

1.378 Beiträge seit 2006
vor 15 Jahren

Ich glaub was er meint ist, das das Event das er abonnieren will, keinen sender liefert und er aber trotzdem auf das Event-feuernde Objekt zugreifen will.

Hier nochmal mein Beispiel an deinem Beispiel demonstriert:


myclass.onevent+= (andereKlasse k)=> myclass_onevent(myclass, k);

myclass_onevent(MyClass myclass, andereKlasse k)
{

}

Lg XXX

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 15 Jahren

die klassen die ich nutze sind aus einer dll. die dll kann ich nur einbinden und die klassen verwenden. überladen geht nicht, da es sich um ein client server gebilde handelt und in dem fall eine exception seitens dll (client version not allowed) geworfen wird.

die event methode übergibt nur einen parameter und das ist eine weitere klasse aus der dll.

als beispiel nehme ich mal mehrere gameserver auf denen mehrere spiele laufen können. ein spiel kann auf mehreren servern gespielt werden.
der GameMonitor überwacht die spiele


private void btn1_Click(object sender, EventArgs e)
{
 GameServer gm = new GameMonitor();
 gm.Username = "user1";
 gm.Password = "pass1";

 gm.OnRefreshGame +=
 new GameMonitor.OnRefreshGameEventHandler(gm_OnRefreshGame);
 gm.Start();
}

void gm_OnRefreshGame(Game g)
{
 //auslesen welches spiel gespielt wird. hier gibts keine verbindung zwischen spiel
 //und GameMonitor mehr.
 Console.WriteLine(g.GameName);
}

ich hoffe es ist jetzt verständlicher 😃

@ XXX:
wenn ich deinen code richtig verstehe, kann ich so also das event 'erweitern'?
gruß

Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 15 Jahren

Sorry für Doppelpost aber das wollte ich gerne extra schreiben.

Danke XXX deine Variante funktioniert super.
Dieses Konstrukt kenne ich gar nicht. Wo kann ich das noch mal genauer nachlesen? Hast du dazu vllt einen Link?

Dank und Gruß
afr0

Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

Gelöschter Account
vor 15 Jahren

stichwort: "Lambda Expression"