Avatar billede nielsbrinch Nybegynder
25. januar 2005 - 11:10 Der er 7 kommentarer og
1 løsning

Reflection på objekt der er ukendt indtil runtime

Jeg vil gerne lave en metode der modtager et object, finder ud af hvilket objekt det er, og kalder alle members på objektet.

Her er hvad jeg har indtil videre:

private string ObjectToString(object o)
{
    Type t = o.GetType();
    string output = "ToString of "+t.Name+"\n";

    foreach (PropertyInfo info in t.GetProperties())
    {
        output += info.ToString()+"\n";
    }

    return output;
}

Jeg giver metoden mit objekt der hedder UserManager der har et væld af metoder og properties af alle mulige forskellige typer.

Output er:

ToString of UserManager
Int32 GetHashCode()
Boolean Equals(System.Object)
System.String ToString()
System.Type GetType()

Godt nok bliver objektet identificeret som en "UserManager", men de metoder der tilsyneladende er på objektet, er kun dem der er på "object" og ikke dem der er på "UserManager".

Hvordan får jeg objektet konverteret rigtigt så objektets metoder kan identificeres og kaldes? Metoden må ikke have kendskab til det miljø den ligger i - det går altså ikke at begynde at hente type-arrays fra dens assembly, med mindre også det kan gøres runtime.
Avatar billede guidmaster Nybegynder
25. januar 2005 - 11:12 #1
Mon ikke du kan bruge nogle af de metoder jeg nævner på http://www.dotnetforum.dk/artikler/Intro-til-reflection.aspx
Avatar billede nielsbrinch Nybegynder
25. januar 2005 - 11:37 #2
Tak, det er et rigtig godt link, det har i hvert ført mig videre så jeg kan få navne få alle attributter, metoder og properties ud af objektet.
Avatar billede nielsbrinch Nybegynder
25. januar 2005 - 12:01 #3
Jeg har fundet ud af at kalde GetValue på et FieldInfo-objekt og få attributtens værdi ud. Jeg forstår ikke helt hvorfor jeg skal sende objektet med - den ved jo godt hvilket objekt den hører til.

Jeg kan se man kan kalde GetValue på en PropertyInfo også, men den skal have objektet og et object array af indexer - er det her en lidt rodet afdeling af .NET-frameworket eller er det mig der ikke forstår idéen med det? Hvorfor er det et object array og ikke et int array?
Avatar billede burningice Nybegynder
25. januar 2005 - 12:41 #4
man kan godt bruge andre typer end int til index, så derfor.

Om det er specielt rodet? nææh, det vil jeg ikke mene, men det langhåret. Reflection er ikke noget man bare lige kaster sig ud i og så regner med det virker første gang :)

Ang. at sende object med, så kommer det af at hvis du ikke gjorde det, ville det svare til at kalde en statisk metode/property/field.
Du udfører GetValue på en TYPE... ikke selve objectet. Du skal jo have en instans som den faktiske værdi til fieldet befinder sig, ellers får du ikke så meget ud af det.

Så nej, den ved ikke hvilket object din field tilhører, da al reflection foregår nede på type-niveau.

Du har højst sandsynligt brug

Type t = ditObject.GetType();
t.osv osv osv..

og her får du jo fat i objectets type, og når du så arbejder videre med det er der ingen reference til selve objectet mere.
Avatar billede nielsbrinch Nybegynder
25. januar 2005 - 12:49 #5
Ja du har ret, det giver fuldstændig mening.
Avatar billede nielsbrinch Nybegynder
14. april 2005 - 11:27 #6
Læg et svar, begge to - og lad os få lukket spørgsmålet.
Avatar billede burningice Nybegynder
14. april 2005 - 11:52 #7
svar :)
Avatar billede nielsbrinch Nybegynder
27. april 2005 - 19:59 #8
tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester