Mechanizm refleksji i StackTrace

Post on 23-Jan-2016

36 views 0 download

description

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? - PowerPoint PPT Presentation

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