Avatar
Denis Homolík (Alfonz):

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
Vše je možné, dokud si to myslíte!
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Denis Homolík (Alfonz)
Jan Vargovský:

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
Redaktor
Avatar
coells:

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
Odpovídá na coells
Denis Homolík (Alfonz):

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
Vše je možné, dokud si to myslíte!
Avatar
coells
Redaktor
Avatar
Odpovídá na Denis Homolík (Alfonz)
coells:

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  +1 16.8.2014 22:30
Avatar
Odpovídá na coells
Denis Homolík (Alfonz):

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
Vše je možné, dokud si to myslíte!
Avatar
coells
Redaktor
Avatar
Odpovídá na Denis Homolík (Alfonz)
coells:

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
Nahoru Odpovědět 17.8.2014 15:23
Vše je možné, dokud si to myslíte!
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.