IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
alfonz
Člen
Avatar
alfonz:16.8.2014 20:56

Reflexí jsem si vytvořil objekt, který chci přidat do seznamu který má typ ze kterého vytvořený objekt dědí. Zkoušel jsem typ převést do správného typu, ale to nejde protože ten typ vlastně neznám.
Reflexe:

System.Activator.CreateInstance(Type.GetType("Namespace." + record.Type), args)
Odpovědět
16.8.2014 20:56
lmao
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na alfonz
Jan Vargovský:16.8.2014 21:16

Zkus sem poslat ty třídy. Btw, proč nezískáš type skrz GetType na třídě Object nebo skrz typeof(class)? :)

 
Nahoru Odpovědět
16.8.2014 21:16
Avatar
coells
Tvůrce
Avatar
coells:16.8.2014 21:18

Pokud znáš předka, víc nepotřebuješ vědět.

List<MyBaseClass> list = new List<MyBaseClass>();
object x = System.Activator.CreateInstance(Type.GetType("Namespace." + record.Type), args);
list.Add((MyBaseClass)x);
 
Nahoru Odpovědět
16.8.2014 21:18
Avatar
alfonz
Člen
Avatar
Odpovídá na coells
alfonz:16.8.2014 22:25

A co když vytvořím reflexí třídu která z té třídy dědí a má metodu navíc a potřebuju tu metodu volat?

Nahoru Odpovědět
16.8.2014 22:25
lmao
Avatar
coells
Tvůrce
Avatar
Odpovídá na alfonz
coells:16.8.2014 22:30

Pak bys měl znát rozhraní, které definuje tuhle metodu a není v tom problém, protože v opačném případě porušuješ principy OOP.

Ale pokud ti na OOP nezáleží a opravdu ji chceš zavolat, tak přes reflection nebo dynamic.

object x = System.Activator.CreateInstance(Type.GetType("Namespace." + record.Type), args);

// dynamic
dynamic dx = x;
dx.NeznamaMetoda();

// reflection (priblizne, nemam tu windows)
var method = x.GetType().GetMethod("NeznamaMetoda");
method.Invoke(x, null);
Editováno 16.8.2014 22:30
 
Nahoru Odpovědět
16.8.2014 22:30
Avatar
alfonz
Člen
Avatar
Odpovídá na coells
alfonz:17.8.2014 15:06

Díky, ale já potřebuju uložit tu instanci bez převodu na jeho předka, ale aby zůstal jako potomek a uložil se do seznamu jako potomek.

Nahoru Odpovědět
17.8.2014 15:06
lmao
Avatar
coells
Tvůrce
Avatar
Odpovídá na alfonz
coells:17.8.2014 15:20

Typ třidy je runtimová informace, nejde "převést". Přetypování určuje pouze způsob, jak se na instanci objektu díváš, neurčuje, čím instance je. V prvním příkladu ukládám instance, které dědí z MyBaseClass, ale to nemá vliv na jejich vlastní typ.

 
Nahoru Odpovědět
17.8.2014 15:20
Avatar
alfonz
Člen
Avatar
Odpovídá na coells
alfonz:17.8.2014 15:23

Ok, díky :)

Nahoru Odpovědět
17.8.2014 15:23
lmao
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 8 zpráv z 8.