ხელსაწყო რომელიც ხელმისაწვდომი გახდა იმის შემდეგ რაც კაცობრიობამ ობიექტ ორიენტურებულ სამყაროში შევდგით ფეხი. არსებობს ისეთი შემთხვევები როდესაც ჩვენ არ გვაქვს უშუალო წვდომა რომელიმე კლასსზე namespace - სზე ან მოდულზე და ეს ობიექტი კიდევ მოცემული გვაქვს .dll, .exe ფაილში ან თუნდაც შექმნილია დინამიურად და დროებით ბუდობს მეხსიერებაში და გამოყენება მისი კი გარდაუვალია დასახული ამოცანისათვის. ასეთი პრობლემის გადასაჭრელად შექმნილი იქნა ხელსაწყო სახელად Reflection. ეს არ არის Microsoft - ის მოგონილი ტექნოლოგია, მისი მოძიება შეიძლება აგრეთვე Java - შიც და სხვა მაღალი დონის პროგრამირების ენებში, თუმცა გეიტსის მუშაკებს იგი თავისი პრინციპებით აქვთ გადაწყვეტილი.

Reflection ეს არის ტექნოლოგია რომელიც საშუალებას გვაძლევს ჩავტვირთოთ მოდულები, სახელთა ერთობლიობა თუ კლასები მეხსიერებაში დინამიურად. მეტად რომ აღარ გამეწელოს საუბარი გადავალ პირდაპირ ცოცხალ მაგალითებზე. Reflection - ის ძლევამოსილების გამოსაყენებლად პირველ რიგში უნდა ჩავრთოთ namespace - ი Syste.Reflection
საცდელ კურღელად აღებული მაქვს კომპანია ტელერიკის მიერ შექმნილი RAD კონტორლების dll ფაილი სადაც მოიძიება ობიექტების საკმაოდ დიდი ერთობლიობა. დავაინსპექტოთ ეს dll ფაილი ამოვიღოთ მისი შიგნეულობა და გამოვიტანოთ ყველაფერი სააშკარაოზე. საამისოდ გამოვიყენოთ კლასი Assembly. და ჩავრვირთოთ dll ფაილის შემადგენლობა Assembly ტიპის ობიექტში.

Assembly MyAssembly = Assembly.LoadFile(Path + "Telerik.Web.UI.dll");
იმისთვის რომ გავიგოთ რა კლასებს შეიცავს ეს ასამბლეა შევუშვათ საქმეში მისი ერთ ერთი მეთოდი GetTypes() რომელიც დააბრუნებს, Type[] ტიპის ობიექტთა მასივს.

Type[] MyTypes = MyAssembly.GetTypes();
ან კიდევ თუ ვიცით კონკრეტული კლასის სახელი რომლიც გვინდა რომ ამოვიღოთ ამ ასამბლეიდან გამოვიყენოთ მეთოდი GetType(string TypeName).

Type RadComboBoxType = MyAssembly.GetType("Telerik.Web.UI.RadComboBox");
ამგვარად Type ტიპის ობიექტ RadComboBoxType - ში ახლა ზის Telerik.Web.UI.RadComboBox - ი რომელიც პრაქტიკულად სრული ანალოგია შემდეგი ჩანაწერისა:

Telerik.Web.UI.RadComboBox RadComboBoxType = new Telerik.Web.UI.RadComboBox();
უბრალოდ სამართავად უფრო მოუქნელი ვიდრე პირდაპირი ინსტანცია, თუმცა ფუნქციონალობა ზუსტად იგივე. ამრიგად ჩვენს Type RadComboBoxType ობიექტიდან შეგვიძლია მივწვდეთ ნებისმიერ მეთოდს, თვისებასა თუ ხდომილებას რაც კი გააჩნია Telerik.Web.UI.RadComboBox - ს. გამოვიყენოთ ამისათვის Type მეთოდები:

  • MethodInfo[] GetMethods() - MethodInfo GetMethod(string MethodName)
  • PropertyInfo[] GetProperties() - PropertyInfo GetProperty(string PropertyName)
  • EventInfo[] GetEvents() - EventInfo GetEvent(string EventName)
მეთოდების - მეთოდის, თვისებების - თვისებისა და ხდომილებათა - ხდომილების, ობიექტთა ამოსაღებად. შემდეგი კოდის დემონსტრირებით მე მინდა წარმოგიდგინოთ თუ როგორ შეიძლება მივწვდეთ დინამოურად ჩატვირთული ობიექტის თვისებებს, ჩავწეროთ მათში სხვადასხვა მნიშვნელობები და გამოვიძახოთ მათი მეთოდები რაიმე ფუნქციონალობის შესასრულებლად. ქვემოთ მოყვანილი მაგალითი ჩამოსაშლელ სიას (ე.წ Combobox - ს) გადააბავს გარკვეულ საწყის მნიშვნელობებს.

object O = Activator.CreateInstance(RadComboBoxType);
RadComboBoxType.GetProperty("ID").SetValue(O, "Combo", null);

var data = new object[]{ new { ID = 1, Name = "One" },
    new { ID = 2, Name = "Two" },
    new { ID = 3, Name = "Three" },
    new { ID = 4, Name = "Four" },
    new { ID = 5, Name = "File" },
    new { ID = 6, Name = "Six" },
    new { ID = 7, Name = "Seven" },
    new { ID = 8, Name = "Eight" },
    new { ID = 9, Name = "Nine" },
    new { ID = 10, Name = "Ten" },
  };

RadComboBoxType.GetProperty("DataSource").SetValue(O, data, null);
RadComboBoxType.GetProperty("DataTextField").SetValue(O, "Name", null);
RadComboBoxType.GetProperty("DataValueField").SetValue(O, "ID", null);

MethodInfo M = RadComboBoxType.GetMethod("DataBind");
M.Invoke(O, null);

object ItemCollection = RadComboBoxType.GetProperty("Items").GetValue(O, null);

int count = (int)ItemCollection.GetType().GetProperty("Count").GetValue(ItemCollection, null);
თუ count ცვლადის მნიშვნელობას დავბეჭდავთ ეკრანზე, დავინახავთ რომ იგი 10 - ის ტოლია. ე.ი. ყველა ფუნქცია წამატებით შესრულდა.
  1. შეიქმნა RadComboBox - ის ინსტანსი.
  2. მიენიჭა უნიკალური იდენტიფიკატორი.
  3. გადაება DataSource - ის მნიშვნელობათა მასივი.
  4. მიენიჭა შესაბამისი DataTextField და DataValueField.
  5. წარმატებულად გამოძახებულ იქნა DataBind მეთოდი.
(მაგალითი შეგიძლიათ მოქაჩოთ ფაილად მიმაგრებული არქივიდან)

ზუსტად Reflection ტექნოლოგიის გამოყენებით მუშაობს ყველასათვის ცნობილი .Net - ის კომპონენტი GridView + ObjectDataSource.
როგორც ვიცით ObjectDataSource - ს TypeName - ს სტრიქონად მიეწოდება იმ კლასის სახელი, რა ტიპის ობიექტებიც ბრუნდება კოლექციაში, SelectMethod - ს კი გადაეცემა იმ მეთოდის სახელი რომელიც უნდა გამოძახებულ იქნას DataSource - ის მნიშვნელობების მისარებად და <SelectParameters> კოლექციას გადაეცემა ის პარამეტრები რომლებიც შეშვებულ უნდა იქნან SelectMethod - ში. GridView - Field ები არიან ის თვისებები რომლებსაც კომპონენტა GetProperty() მეთოდის გამოძახების საშუალებით დაიბრუნებს.

reflection.rar (3.93 mb)