C#-da refleksiyalar

Kodera
Kodera
Published in
3 min readJul 29, 2018

Reflection sinfi assembly daxilində, yəni proqramın tamamının daxilində sinif, metod kimi növlər haqqında bilgilər almağımızı təmin edir.

Qapaqlar.

.NET (dot NET)-in çox güclü bir funksiyasıdır. Gördüyü iş ilə, hansı növü sorğulamaq istəyiriksə, həmin növ haqqında məlumatları — “metadata” bilgilərini əldə edir. Butün bu əməliyyat zamanı System.Reflection kitabxanasını istiadə edir və üzərində əməliyyat aparılan “növ”ü System.Type obyekti ilə bizə təklif edir. Type sinfi əslində mücərrəd bir class`dır və Memberİnfo sinfindən törəyən bir çox metodlara sahibdir. Növ üzvləri ilə bağlı bilgi əldə edilə və çağırıla bilər. Assembly-dan növ yüklənə bilər və yeni bir obyekt yaradıla bilər.

Gəlin Assembly anlayışı və Assembly sinfi nədir, ona baxaq. “.NET” mühitində yığılan proqramlar tərtib (İng. dilində: Debug) olunarkən özündə ehtiva etdiyi hər bir metod, sinif, dəyişkən və metadata adlanan məlumatlarla birgə tərtib olunur. Mənbə kodlarının bu metadata adlanan məlumatları ehtiva edən dot NET toplusunu assembly adlandıra bilərik. Və əslində, debug olunmuş hər bir vahid assembly adlanır.

Reflection sinfi ilə .exe uzantılı faylın ehtiva etdiyi kodları görüntüləyə bilərik. Əlbəttə ki, DotFuscator proqramları ilə faylın üzərində dəyişikliklər edilməyibsə. Gəlin burada birr haşiyə çıxaq və DotFuscator-un nə olduğuna baxaq:

DotFuscator “Reverse engineering” adlanan prosesdən proqramı qorumaq üçündür. Reverse engineering isə .NET mühitində yazılmış proqramların mənbə kodlarının DeCompiler`lər ilə oxunmasını təmin etməkdir. Qeyd edək ki, bu zaman proqramın; məsələn hər hansısa bir Verilənlər bazası serveri ilə bağlantısı olan proqramın kodlarını görə və həmin serverin ünvanını, onun admin paneli və sair vacib parametrlərini əldə edə bilərik.

Assembly demişdik, bir proektdə birdən çox assembly lar olar bilər və biz AppDomain sinfi ilə bütün assembly-ları əldə edə bilərik.

AppDomain sinfinin GetAssemblies() statik metodu ilə bu Assembly-ların adlarını Assembly növündə bir seriyaya köçürə bilərik.

Assembly sinfinin GetExecutingAssembly() statik metodu ilə hal-hazırda çalışan assembly-ı əldə edə bilərik.

Assembly sinfinin LoadFrom() metodu ilə bir assembly sənədinin ünvanı müəyyən edilərək həmin assembly sinfinin obyektləri əldə edilə bilər.

Firkrimcə, bu qədər nəzəri bilgi hələki yetərli olacaq. Keçək Type sinfinə və onun Reflection ilə bağlantısına.

MemberInfo sinfi: Bir növdəki bütün üzvləri təmsil etmək üçün istifadə olunur. Məsələn, aşağıdakı kodda String növünün bütün metodlarını WinForm kontrolu olan ListBox-a köçürürük.

Methodİnfo sinfi: Bir növdəki metodları təmsil edir və onları real zamanda çağırmağımızı təmin edir.

Bir misal da Methodİnfo üçün yazaq.

Parameterİnfo sinfi: Bir metoddakı parametrləri görməyimizi təmin edir.

Constructorİnfo sinfi: Bir növün konstruktor metodları haqqında məlumat verir.

Properityİnfo sinfi: Bir növün özəllikləri haqda məlumat verir.

Fieldİnfo sinfi: Bir növün dəyişkənləri haqda məlumat verir.

Eventİnfo sinfi: Bir növün event-ləri haqda məlumat verir.

Son siniflər haqda misal göstərmirik, çünki, birinci və ikinci misallardakılara uyğun olaraq asanlıqla istifadə edə bilərsiniz.

Bəs Reflection nə üçün istifadə olunur?!

Təsəvvür edin ki, siz bir böyük proekt hazırlamısınız və bu proekt istifadəyə və redaktəyə açıqdır. Yəni, müxtəlif insanlar proqramı istifadə edə bilər, üzərində dəyişikliklər edə bilər və əlavələr yaza bilər. Bu zaman sizin proqramı yazarkən yaratdığınız siniflər haqda məlumatları sözügedən sinif vasitəsi ilə əldə edə bilər.

Yeri gəlmişkən, Reflection üçün hazır proqramlar var. Bunlardan biri də

.NET Reflector

proqramıdır

Buradan yükləyə bilərsiniz.

--

--