160 likes | 367 Views
Mechanizm refleksji i StackTrace. Artur Paech Przemko Robakowski. Plan prezentacji. 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?
E N D
Mechanizm refleksji i StackTrace Artur Paech Przemko Robakowski
Plan prezentacji • 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
Mechanizm refleksji • Mechanizm pozwalający na dynamiczne wczytywanie assemblies, dynamiczne tworzenie typów, obiektów i wywoływanie metod w zależności od kodu programu
Wczytywanie assemblies • 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
Tworzenie obiektów i wywoływanie metod • 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
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
Dynamiczne tworzenie typów • AssemblyBuilder • ConstructorBuilder • EnumBuilder • EventBuilder • FieldBuilder • LocalBuilder • MethodBuilder • ModuleBuilder • ParameterBuilder • PropertyBuilder • TypeBuilder
StackTrace – Co to jest? • 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 – przydatność • 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 ;)
Klasa StackTrace – cz. I • 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. II • Właściwości • FrameCount • Metody • Equals(Object) • Finalize() • GetFrame() • GetFrames() • GetHashCode() • GetType() • MemberwiseClone() • ToString()
Klasa StackFrame • Konstruktory • StackFrame() • StackFrame(Boolean) • StackFrame(Int32) • StackFrame(Int32, Boolean) • StackFrame(String, Int32) • StackFrame(String, Int32, Int32) • Metody • GetFileColumnNumber() • GetFileLineNumber() • GetFileName() • GetMethod()
StackTrace&StackFrame - Przykład • class Program { • static void Main(string[] args) { • TestClass.GoNow(); } • } • classTestClass { • public static void GoNow() { • var stackTrace = newStackTrace(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()); • } } }
Na wyjściu programu • 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
Bibliografia • msdn.microsoft.com