[ bags @ 04.05.2008. 23:16 ] @
Imam metodu public T GetInstance<T>().Preko refleksije za vreme izvodjenja pokupim Type (instanceType) koji trebam instancirati i pozovem metodu ovako:

Code:

getInstance<instanceType>();


i naravno javlja gresku kako nema tog namespace-a.

Gdje gresim?


[ mmix @ 05.05.2008. 08:58 ] @
Generics radi nad tipovima, ne nad instancama. AKo dobro pretpostavljam ti si radio nesto ovako:

Code:

Type instanceType;
isntanceType = reflectionUzmiType(nesto, nesto, ..);
getInstance<instanceType>();

A to ne moze, instanca tipa Type nije tip, ona je deskriptivni objekat koji opisuje tip i sam po sebi je najobicniji objekat i ne moze da se iskoristi kao Generics parametar. Malo deluje zbunjujuce ali iz istog razloga ne mozes da napravis sledeci code

Dictionary<"pera", 123>

vec moras

Dictionary<string, int>

[ bags @ 05.05.2008. 09:32 ] @
"Osjetio" sam da je to u pitanju.

Ima li mozda neko zaobilazno resenje osim Refelction.Emit-a ?
[ _prompt @ 05.05.2008. 09:56 ] @
Pogledaj Activator.CreateInstance metod ili kreiraj Assembly objekat
pa iz njega pozovi CreateInstance.
[ mmix @ 05.05.2008. 10:04 ] @
Ne treba ti aktivator u ovoj situaciji, sve sto ti treba vec imas.

Emit se koristi za generisanje novih tipova, ne za instanciranje postojecih. Ako hoces da napravis instancu tipa koji je opisan sa instanceType koristis sledeci kod:

Code:

ConstructorInfo constr = instanceType.GetConstructor(Type.EmptyTypes);
object instance = constr.Invoke(null);


ovaj kod instancira objekat koristeci default konstruktor (onaj bez parametara), ako hoces da pozoves konstruktor sa odredjenim potpisom, pogledaj help za GetConstructor() i Invoke() metode.