MethodInfo e.l. for metode som System.String

Tags:    .net

Overskriften var lidt skæv, men nu forklarer jeg lige mit problem her:

Jeg har hårdt brug for at finde en metodes 'returntype'. En mulighed er MethodInfo-klassen, hvilket vil være en ligeså tilfredsstillende løsning. Problemet er, at jeg kun har metodens navn (fx. System.Console.WriteLine eller System.Windows.Forms.MessageBox) som en streng.

Med andre ord vil jeg (det er ikke det jeg rigtig vil, men det forklarer det vist ret godt) lave et program, hvor brugeren skriver System.Console.ReadLine i konsollen, og så udskriver programmet System.String, da System.Console.ReadLine som bekendt returnerer en System.String.

Jeg har faktisk gjort en hel del forsøg og på et tidspunkt fandt jeg også noget på CodeGuru, som jeg mente løste mit problem, men det gjorde det så altså alligevel ikke, eller også kunne jeg ikke finde ud af det. Der var blandt andet nogle klasser i System.CodeDom og Microsoft.CSharp namespaces og, som du måske kan regne ud, MethodInfo/MethodBody og den slags. Også CodeDomProvider, ICodeCompiler, Assembly og lignende klasser/interfaces indgik.

Jeg kan godt regne ud, det her nok afhænger af hvilke assemblies/DLL-filer, programmet er tilknyttet, men hvis vi fx. starter med metoder i System.Console klassen og system.dll, kan jeg måske godt finde ud af self at udbygge det.



Thomas



7 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Hej Thomas,

Du skal have fat i noget Reflection, som i øvrigt fungerer utroligt godt. Prøv at Google lidt efter det, det er rimeligt overskueligt at komme i gang med :)

Mvh.

Kasper (TSW)



Indlæg senest redigeret d. 11.09.2009 21:15 af Bruger #1
Hvad med dette:

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 11.09.2009 10:26 af Bruger #6559
Jamen jeg har jo lige sagt, at jeg kun har metodens navn som en streng. Jeg ved ikke på forhånd, hvad metoden hedder; brugeren indtaster navnet i konsollen. Jeg kan jo ikke sidde og tjekke ALLE metoder i hele .NET-frameworket. Altså jeg nægter at gøre noget i stil med dette:

switch (Console.ReadLine())
{
case "Console.ReadLine":
return "string";
case "Console.WriteLine":
return "void";
// og 5000 cases senere
case "StringBuilder.Append":
// og endnu flere senere
case "OdbcConnection.Open":
}

Nu læste du vel hele mit indlæg inden du svarede, ikke?



Vil du gifte dig med mig, Kasper?

Jeg fatter ikke, jeg ikke fik bikset det sammen i nat, jeg har rodet med ALLE klasserne og metoderne i koden, jeg poster her. Jeg skulle bare lige se Type.GetType metoden inde på CodeGuru (som jeg fandt ved at søge på Reflection på Google, derfor jeg mener et giftemål er passende), og så var den der.

Fold kodeboks ind/udKode 


Jeg prøvede med GetMethod først (istedet for GetMethods) men den brokkede sig over en tvetydighed (forståeligt, men intet problem), så derfor brugte jeg linq.



Her er den rettede version af det, jeg skrev før. Programmet isolerer returtypen af en metode i formatet "[namespace].[class].[method]" og har et valgfrit argument til at specificere argumenttyper, den skal lede efter.

Fold kodeboks ind/udCSharp kode 




Indlæg senest redigeret d. 12.09.2009 01:27 af Bruger #8985
Fedt at du fik det til at virke, Thomas! Reflection kan være uhyre nyttigt i rigtigt mange situationer, så det er en god ting at have arbejdet med :)

Mvh.

Kasper (TSW)



Ja, det er også mit indtryk af det. Tror i det hele taget, det er godt at kende så mange namespaces som muligt.



t