Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 11:42 Der er 27 kommentarer og
1 løsning

Metode og linjenummer hvor metoden er blevet kaldt

Jeg vil gerne lave en metode som kan identificere hvor den blev kaldt fra. Den skal kunne finde ud af hvilken klasse, hvilken metode og hvilken linje metoden blev kaldt fra.

Nogen der ved hvordan?
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 11:54 #1
Her er et eksempel på hvad det er jeg mener:

class Test
{
  public void MinMetode()
  {
    string stuff = DoSomeStuff();

    Log.Write(stuff);

    DoSomethingElse();
  }
}

class Log
{
  public static void Write(string text)
  {
    Herinde vil jeg gerne kunne udtrække
    klassen "Test", metoden "MinMetode" og
    linjenummeret "7" ud og skrive det til en fil.
  }
}
Avatar billede burningice Nybegynder
23. januar 2005 - 12:57 #2
du kan kun finde ud af hvilket linjenummeret hvis koden kører i debug og du har adgang til symbol-filen. Det har man dog aldrig, forhåbenligt i hvert fald, når at ens applikation kører i et driftsmiljø, så den kan du godt glemme.

Ang. de to andre, klassen og metoden kan det snildt gøres ved hjælp af reflection.
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 13:28 #3
Det er ok at det kun virker hvis koden kører i debug. Har du eksempler på alle 3 ting?
Avatar billede burningice Nybegynder
23. januar 2005 - 13:44 #4
Yearh.. har kigget på StactTrace og StackFrame-klasserne, og de ser ud til at gøre det du eftersøger. Eksempler? Tjoo... lad mig se
Avatar billede burningice Nybegynder
23. januar 2005 - 13:50 #5
using System;
using System.Diagnostics;

namespace _583777
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Log.Write("hej");

            Console.ReadLine();
        }
    }

    class Log
    {
        public static void Write(string text)
        {
            StackTrace st = new StackTrace(true);
            StackFrame sf = st.GetFrame(1);

            Console.WriteLine("Metoden der logger: "+ sf.GetMethod().Name);
            Console.WriteLine("Linjenummeret der kaldte loggen: "+ sf.GetFileLineNumber().ToString());
        }
    }
}
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:01 #6
Tak skal du have. Det ser ud til at virke temmelig meget ligesom jeg ønskede.

Der er ikke klassenavn og linjenummeret passer ikke helt nøjagtigt - måske fordi det er en aspx-codebehind jeg tjekker på.
Avatar billede burningice Nybegynder
23. januar 2005 - 14:09 #7
en aspx-codebehind skulle da gerne passe med klasse-navnet? Det er koden inde på selve aspx-siden der får et sjovt-lydende klassenavn.

Men hvordan får du fat i klasse-navnet? det er jo ikke noget der ligger i StackFramen.
Avatar billede burningice Nybegynder
23. januar 2005 - 14:12 #8
hm... ja, nu skal jeg ikke være for hurtig ude... det burde virke med dette:

Console.WriteLine("Klassen der kaldte loggen: "+ sf.GetMethod().ReflectedType.Name);
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:12 #9
Nej, jeg kan heller ikke finde klassenavnet i StackFramen - det er derfor jeg ikke kan få fat i det. Det er såmænd heller ikke det vigtigste, jeg kan jo til nøds udskrive filnavnet, idet jeg har en fil pr. klasse.
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:14 #10
Det virker perfekt. Tak. Linjenummeret er dog stadig en smule upræcist :-)
Avatar billede arne_v Ekspert
23. januar 2005 - 14:15 #11
Hvad med sf.GetMethod().DeclaringType ?
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:17 #12
Jeg kan ikke umiddelbart se hvad forskellen på DeclaringType og ReflectedType er.
Avatar billede arne_v Ekspert
23. januar 2005 - 14:18 #13
Jeg formoder at forskellen vil vise sig hvis metoden kommer fra en parent
klasse.
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:20 #14
Ahaa.

ReflectedType er så der hvor metoden rent faktisk er implementeret og DeclaringType er der hvor den er defineret. Eller omvendt ...
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:32 #15
Jeg har en abstrakt klasse og en underliggende klasse der overrider en metode. I det tilfælde er det den underliggende klasse der er både ReflectedType og DeclaringType.
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:38 #16
Hvis metoden ikke er overridden giver både ReflectedType og DeclaringType den abstrakte klasse. Den implementerer endda et interface. Indtil videre er det i alle tilfælde der hvor koden rent faktisk er implementeret, at ReflectedType og DeclaringType peger på.
Avatar billede arne_v Ekspert
23. januar 2005 - 14:47 #17
Hm.

Så er ReflectedType ikke hvad jeg troede at det var.

Gad vide hvad forskellen så er på de to.
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 14:52 #18
The DeclaringType property retrieves a reference to the Type object for the type that declares this member. A member of a class (or interface) is either declared or inherited from a base class (or interface). The returned class might not be the same as the Type object used to obtain this MemberInfo object.

Sådan er det åbenbart, men jeg har ikke lige haft held til at fremprovokere det.
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 15:08 #19
Lad os få lukket spørgsmålet. Læg svar.
Avatar billede burningice Nybegynder
23. januar 2005 - 15:12 #20
:) svar
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 15:14 #21
Også tak til dig arne.
Avatar billede burningice Nybegynder
23. januar 2005 - 15:23 #22
hvad mener du forresten med at linjenummeret er upræcist? Det skulle det meget gerne ikke være
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 15:28 #23
Den returnerer linje 45 selvom jeg kalder metoder på linje 42.
Avatar billede burningice Nybegynder
23. januar 2005 - 15:42 #24
hm... ja, det er da lidt træls. håber ikke at VS's debugger bruger de linjenummer til at hoppe til det sted i koden man har sat breakpoints, for så kan det da hurtigt blive noget rod.
Avatar billede nielsbrinch Nybegynder
23. januar 2005 - 15:44 #25
VS's debugger kender sikkert den hemmelige metode som altid giver det rigtige linjenummer :-)
Avatar billede lifo Nybegynder
23. januar 2005 - 17:21 #26
du burde måske kigge efter log4net framworket på http://logging.apache.org/log4net/
det er meget meget let at bruge og har mange muligheder til
hvordan og hvor til den skal logge
Avatar billede burningice Nybegynder
23. januar 2005 - 18:01 #27
se... det var jo et rimelig cool stykke software :)
Avatar billede nielsbrinch Nybegynder
24. januar 2005 - 08:56 #28
Ja, jeg kender det godt. Det er pga. det jeg vidste man kunne få metodenavnet ud osv - jeg vidste bare ikke hvordan.
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