O transferze emocji i nastrojów między ludźmi – mechanizm i ...
Mechanizm refleksji i StackTrace
description
Transcript of Mechanizm refleksji i StackTrace
![Page 1: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/1.jpg)
Mechanizm refleksji i StackTrace
Artur PaechPrzemko Robakowski
![Page 2: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/2.jpg)
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
![Page 3: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/3.jpg)
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
![Page 4: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/4.jpg)
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
![Page 5: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/5.jpg)
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
![Page 6: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/6.jpg)
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
![Page 7: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/7.jpg)
AssemblyBuilder ConstructorBuilder EnumBuilder EventBuilder FieldBuilder LocalBuilder MethodBuilder ModuleBuilder ParameterBuilder PropertyBuilder TypeBuilder
Dynamiczne tworzenie typów
![Page 8: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/8.jpg)
Refleksja - przykład
![Page 9: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/9.jpg)
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?
![Page 10: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/10.jpg)
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ść
![Page 11: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/11.jpg)
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
![Page 12: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/12.jpg)
Właściwości◦ FrameCount
Metody◦ Equals(Object)◦ Finalize()◦ GetFrame() ◦ GetFrames()◦ GetHashCode()◦ GetType()◦ MemberwiseClone()◦ ToString()
Klasa StackTrace – cz. II
![Page 13: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/13.jpg)
Konstruktory◦ StackFrame()◦ StackFrame(Boolean)◦ StackFrame(Int32)◦ StackFrame(Int32, Boolean)◦ StackFrame(String, Int32)◦ StackFrame(String, Int32, Int32)
Metody◦ GetFileColumnNumber()◦ GetFileLineNumber()◦ GetFileName()◦ GetMethod()
Klasa StackFrame
![Page 14: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/14.jpg)
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
![Page 15: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/15.jpg)
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
![Page 16: Mechanizm refleksji i StackTrace](https://reader036.fdocuments.net/reader036/viewer/2022083010/568151d1550346895dc0099a/html5/thumbnails/16.jpg)
msdn.microsoft.com
Bibliografia