Mechanizm refleksji i StackTrace
description
Transcript of Mechanizm refleksji i StackTrace
Mechanizm refleksji i StackTrace
Artur PaechPrzemko Robakowski
Refleksja◦ Co to i do czego można to wykorzystać?◦ Wczytywanie assemblies◦ Tworzenie obiektów i wywoływanie metod◦ Dynamiczne tworzenie typów
StackTrace◦ Co to jest i do czego może być przydatne?◦ Opis klasy StackTrace◦ Przykłady
Plan prezentacji
Mechanizm pozwalający na dynamiczne wczytywanie assemblies, dynamiczne tworzenie typów, obiektów i wywoływanie metod w zależności od kodu programu
Mechanizm refleksji
Assembly.Load – ładuje assembly o podanej nazwie, najczęściej z GAC
Assembly.LoadFile – ładuje assembly o podanej nazwie pliku
Assembly.LoadFrom – ładuje assembly o podanej nazwie pliku lub ścieżce
Assembly.ReflectionOnlyLoad Assembly.ReflectionOnlyLoadFrom
Wczytywanie assemblies
Tworzymy obiekt typu Type (Assembly.GetType lub typeOf)
Tworzenie obiektu:◦ Tworzymy obiekt typu ContstructorInfo (metodą
GetConstructor)◦ Wywołujemy jego metodę invoke z tablicą obiektów,
które mają być przekazane jako parametry Wywoływanie metody:
◦ Tworzymy obiekt typu MethodInfo (metoda GetMethod)◦ Wywołujemy jego metodę invoke – 1 argument to
obiekt na rzecz którego wywołujemy metodę, dalej tablica z parametrami
Tworzenie obiektów i wywoływanie metod
Dostęp do innych składowych typu: GetProperty, GetField, GetMembers BindingFlags:
◦ DeclaredOnly – tylko zadeklarowane (bez dziedziczenia
◦ FlattenHeirarchy – zadeklarowane, odziedziczone i protected
◦ Public – publiczne◦ NonPublic – niepubliczne◦ Static – statyczne◦ Instance – należące do instancji klasy (nie statyczne)◦ IgnoreCase – ignoruje wielkość liter
AssemblyBuilder ConstructorBuilder EnumBuilder EventBuilder FieldBuilder LocalBuilder MethodBuilder ModuleBuilder ParameterBuilder PropertyBuilder TypeBuilder
Dynamiczne tworzenie typów
Refleksja - przykład
Stacktrace jest to klasa, która zawiera aktualną i uporządkowaną kolekcję ramek stosu (tj. tablica obiektów typu StackFrame)
Zawiera informację w formie tablicy jednowymiarowej
Uporządkowaną tzn. w odwrotnej kolejności niż zostały klasy/metody wywoływane (na pozycji [0] mamy „najświeżej” wywołaną metodę/klasę, na końcu mamy najbardziej ogólnę klasę np. „main”)
StackTrace – Co to jest?
Przy bardzo zagnieżdżonych wykonaniach kodu
Możliwość logowania działań stosu Nie potrzeba wyrzucać wyjątku, aby
dowiedzieć się co kotek ma w środku ;)
StackTrace – przydatność
Konstruktory◦ StackTrace()◦ StackTrace(Boolean)◦ StackTrace(Exception) ◦ StackTrace(Int32)◦ StackTrace(StackFrame) ◦ StackTrace(Exception, Boolean)◦ StackTrace(Exception, Int32)◦ StackTrace(Int32, Boolean)◦ StackTrace(Thread, Boolean)◦ StackTrace(Exception, Int32, Boolean)
Klasa StackTrace – cz. I
Właściwości◦ FrameCount
Metody◦ Equals(Object)◦ Finalize()◦ GetFrame() ◦ GetFrames()◦ GetHashCode()◦ GetType()◦ MemberwiseClone()◦ ToString()
Klasa StackTrace – cz. II
Konstruktory◦ StackFrame()◦ StackFrame(Boolean)◦ StackFrame(Int32)◦ StackFrame(Int32, Boolean)◦ StackFrame(String, Int32)◦ StackFrame(String, Int32, Int32)
Metody◦ GetFileColumnNumber()◦ GetFileLineNumber()◦ GetFileName()◦ GetMethod()
Klasa StackFrame
class Program { static void Main(string[] args) { TestClass.GoNow(); } } class TestClass { public static void GoNow() { var stackTrace = new StackTrace(true); foreach (var r in stackTrace.GetFrames()) { Console.WriteLine("Filename: {0} Method: {1} Line:
{2} Column: {3} ", r.GetFileName(), r.GetMethod(),
r.GetFileLineNumber(), r.GetFileColumnNumber()); } } }
StackTrace&StackFrame - Przykład
Filename: C:\Users\Artur\Desktop\PW lab\ConsoleApplication1\ConsoleApplication1\Program.cs Method: Void GoNow() Line: 24 Column: 7
Filename: C:\Users\Artur\Desktop\PW lab\ConsoleApplication1\ConsoleApplication1\Program.cs Method: Void Main(System.String[]) Line: 13 Column: 7
Na wyjściu programu
msdn.microsoft.com
Bibliografia