23. januar 2005 - 11:42Der 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.
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. } }
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.
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()); } } }
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.
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.
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å.
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.
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.
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
Ja, jeg kender det godt. Det er pga. det jeg vidste man kunne få metodenavnet ud osv - jeg vidste bare ikke hvordan.
Synes godt om
Ny brugerNybegynder
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.