Få fat i System.Type object via classname som string

Tags:    .net

Hej

Jeg sidder i den situation at jeg skal bruge noget Reflection for at komme videre, og det er et rimeligt nyt emne for mig.

Jeg har derfor søgt på nettet en del, men synes ikke at kunne finde noget om netop dette emne.

Det som der er problemet er kort sagt at få fat i System.Type for en klasse lagret som en string, altså f.eks.

[code="C#"]namespace Kaare.Klasser {
class MinKlasse {
......
}
class Program {
public static void Main(string[] args){
string klasseNavne = "Kaare.Klasser.MinKlasse";
Type minKlasseType = /* hvordan gør man her? */
}
}
[/code]

Bemærk at løsningen jo ikke bare er typeof(Kaare.Klasser.MinKlasse) men at informationen skal hives frem udelukkende ved brug af strengen minKlasseType.

Tak for hjælpen.



7 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Jeg vil tro at du kan bruge Assembly.GetType() (http://msdn2.microsoft.com/en-us/library/y0cd10tb(VS.80).aspx)

Fx:
[code="C#"]using System;
using System.Reflection;

class Test
{
static void Main()
{
Assembly as= Assembly.GetExecutingAssembly();

Type minType = as.GetType("Kaare.Klasser.MinKlasse");

}
}
[/code]

Ellers fandt jeg også lige et eksempel hvor man kalder GetType() på et Module i stedet. Det er her: http://msdn2.microsoft.com/en-us/library/fbzfdta7(VS.80).aspx



Jeg mener det er [Assembly],[Fuldt navn til klasse]
Eller så er det omvendt.

Bemærk du skal ikke skrive .DLL

Så hvis din DLL du skal have type fra er:
Type.GetType("MinDll,MitNamespace.MinKlasse");

Jeg mener dog at du skal have en refference til assemblien.

Hvis du skal lave en klasse on-the-run, fra en fil, så se på Activator.CreateInstance





Tak skal du have, jeg kigger på det hurtigst muligt (sidder lige midt i noget skolearbejde, men kigger nok på det i morgen).



OK jeg har kigget lidt på det nu... det lader til at virke godt nok bortset fra en ting, som jeg ikke lige fik formuleret korrekt.

Den kode hvor reflection delen ligger i, kompilleres faktisk ned til en dll, og bliver derefter brugt som en kontrol på en ASP.Net side, og jeg kan derfor ikke rigtig få hverken GetExecutingAssembly, GetCallingAssembly eller GetEntryAssembly til at virke.

Du ved ikke hvordan jeg får fat i den rigtige assembly vel?



Hvis det Jesper skriver ikke virker, så kan du jo prøve at kigge på nogle af de forskellige Load metoder på Assembly-klassen. (Load, LoadFile osv.) eller GetLoadedModules. Jeg ved ikke helt hvordan det fungerer i et ASP.NET projekt.
Jeg mener nemlig at den selv loader alle assemblies i /bin/ mappen.



Ok jeg roder lidt videre med det.

men altså jeg skal bruge reflection kaldet i en custom kontrol som så bliver kompilleret ned i en assembly (f.eks. mineklasser.dll) herfra skal jeg så bruge denne klasse i hvilket som helst ASP.Net projekt, dvs. jeg ved reelt set ikke om denne klasse ligger i en anden assembly eller den som ASP.Net opretter. Men jeg tror at jeg vil kigge nærmere på GetLoadedModules så :).



Tak skal i have for hjælpen, jeg har ledt lidt mere på nettet og med jeres hjælp og nettets hjælp, så tror jeg at jeg er nået frem til en tilfredsstillende løsning.

Denne artikel ser ud til at indeholde noget spændende om dette emne:
http://www.eggheadcafe.com/articles/20050717.asp



t