Avatar
vodslon
Člen
Avatar
vodslon:

Ahoj,

Takže problém..mám návrhový vzor EventAggregator, který obsahuje Publish, který má něják vstupní parametr, libovný. Takže například _eventAggrega­tor.Publish(Typ­Proměnné).
A na základě TypProměnné já potom můžu pomocí subsriberu, pouštět k tomu přiřazené metody (zápis _eventAggrega­tor.Subscribe<Typ­Proměnné>(Meto­daCoSePustí).­..takže pokud je TypProměnné string, tak se pustí všechny metody v subsriberem přiřazené s typem string. Já vkládám vlastní typObjektu, třeba třída Class1. takže _eventAggrega­tor.Publish(Clas­s1)...tak chci dynamicky měnit, kteří subsribeři budou poslouchat publish typu Class1...Tak to udělám třeba pomocí Xml, ze kterého vytáhnu ve stringu hodnotu "Class1" tak a ted jak já můžu dynamicky změnit veventAggrega­tor.Subscribe<Typ­Proměnné>(Meto­daCoSePustí) ten TypProměnné. Prostě potřebuji měnit TypProměnné na základě hodnoty ve stringu...Umím udělat si Instanci, pomocí GetType() zjistit Typ, ale jak ho tam vložím, je to kravina, ale já fakt nevím :(

 
Odpovědět 16.7.2015 10:12
Avatar
Odpovídá na vodslon
sadlomaslox25:

pokud vim tak misto
Subscribe<Typ­Proměnné>(Meto­daCoSePustí)
by melo byt spis
Subscribe<Typ­Proměnné>(Acti­on<TypProměnné> metoda)
abys mohl ziskat data ze zpravy. Ale pokud zmenis TypProměnné z jedne tridy na druhou tak nejsi chopny ziskat data ze zpravy coz pak podle me ztraci smysl pouzivat eventAggregator :)

 
Nahoru Odpovědět 16.7.2015 20:17
Avatar
vodslon
Člen
Avatar
Odpovídá na sadlomaslox25
vodslon:

ale mě nejde o tu metodu jako takovou...Já budu mít skupinu publisherů, který mi to budou vysílat v různých typech a moje představa je, že k tomu budu moc pomocí konfigu měnit subsribery, což znamená že musím hodnotu ze stringu, která je typ třídy něják přeconvertovat na typ třídy, reference mám v tom problém není. Vše na čem jsem se zasekl je, jak udělat ze string nazavTrídy = "Class1" Subsriber<Class1> -

 
Nahoru Odpovědět 18.7.2015 9:29
Avatar
Odpovídá na vodslon
Petr Štechmüller:

Podívej se na Reflexi, to je to, co potřebuješ...

Nahoru Odpovědět 18.7.2015 10:34
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na vodslon
sadlomaslox25:

podle me je to sice spatne reseni ale ten kus kodu co hledas tak je

var ag = new Aggregator();
var typ = Type.GetType("namespace.Class2");
var publishGenericMethod = typeof (Aggregator).GetMethod("Publish").MakeGenericMethod(typ);
publishGenericMethod.Invoke(ag, new object[] {new Class2()});
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 18.7.2015 14:15
Avatar
vodslon
Člen
Avatar
Odpovídá na sadlomaslox25
vodslon:

Moc děkuji za pomoc :) Nakonec jsem to ještě musel poupravit takto, protože tu metodu co hledám bere v parametru Actinon<Type>

publishGenericMethod.Invoke(_eve, new object[] { new Action<dynamic>((d) => { Console.WriteLine("hello world"); })
 
Nahoru Odpovědět 20.7.2015 10:31
Avatar
vodslon
Člen
Avatar
Odpovídá na sadlomaslox25
vodslon:

Ještě tady k tomu ano je to Subscribe<Typ­Proměnné>(Acti­on<TypProměnné> metoda).
Jenže protože mám všechny ty typy z děděné z jednoho místa, tak je můžu libovolně měnit.

Zatím to testuji ještě abych ukázal upravenou řádku v postu předtím.

publishGenericMethod.Invoke(_eve, new object[] { new Action<dynamic>((d) => { Metoda(d); }) });

ted je vlastně ta Metoda dynamicky plněná Interfacem, který mají všechny ty proměné stejný, takže já si je můžu rozařovat a zároven můžu potom odchytávat data pomocí datového členu té proměné, protože ten mají všichni stejný, snad na to jdu dobře, ale zatím to dělá co potřebuji.

 
Nahoru Odpovědět 20.7.2015 10:51
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.