Witaj na blogu

Witaj na moim blogu, który powstał z potrzeby chwili i mam nadzieję będzie długo istniał i dostarczał wiedzy i uciechy najróżniejszym internetowym indywiduom :). Zamierzam zamieszczać tutaj wymyślone lub wygrzebane przeze mnie rozwiązania problemów algorytmicznych i programistycznych. Możesz też natknąć się na szczyptę humoru lub moich osobistych przemyśleń (nie biorę odpowiedzialności za efekty czytania). Korzystaj z tagów - znajdziesz (być może) to czego szukasz...

piątek, 6 kwietnia 2012

Refleksja - część 1

Ponieważ ostatnio często korzystam z mechanizmu refleksji w C# (.NET) postanowiłem napisać parę słów o tymże mechanizmie i może zamieścić jakieś przykłady w kolejnych częściach. Ale co to w ogóle jest ta refleksja?

Otóż refleksja jest mechanizmem, który umożliwia dostęp do metadanych klasy lub obiektu. Mówiąc po ludzku, korzystając z refleksji, możemy dostać się do pól, właściwości i metod klasy, albo do jej atrybutów. Osobiście najczęściej korzystam z atrybutów, którymi zajmę się na początku.

Otóż atrybuty, są specjalnymi klasami przenoszącymi metadane innych obiektów. Każdy nowy atrybut dziedziczy po klasie Attribute i konwencją jest, że nazwy klas atrybutów kończą się słowem Attribute. Co może zawierać taki atrybut? Każde dane jakie chcemy przypiąć do klasy, jej pól lub właściwości, metod itd, a które będziemy chcieli wyciągnąć w trakcie działania programu. Pracując nad własnym mechanizmem ORM, utworzyłem klasy do przechowywania danych z bazy danych, które dziedziczyły po interfejsie IDBEntity. Klasy te są zbudowane w taki sposób, że posiadają dokładnie te same pola co odpowiadające ima tabele w bazie danych. Wszystko pięknie, ale teraz żeby dowolny rekord odczytać, zapisać lub uaktualnić, muszę w każdej klasie zamieścić odpowiednie metody w których będzie specyficzny dla danej klasy SQL. Trochę z tym dużo roboty, więc posłużmy się atrybutami i mechanizmem refleksji:

  1. Wyposażamy klasę w atrybut opisujący do jakiej tabeli się odnosi
  2. Wyposażamy jej pola (właściwości) w atrybuty opisujące da jakich kolumn w tabeli bazodanowej się odnoszą
  3. Tworzymy klasę statyczną, która na podstawie samego typu klasy, zwróci nam kolekcję rekordów pobranych z odpowiedniej tabeli, a rekordy te będą klasami podanego typu.
NAJPIERW DEKLARUJEMY ATRYBUTY

public class DBTableAttribute : Attribute {
public string TableName { private set; get; }

public DBTableAttribute(string tname){
TableName = tname;
}
}

public class DBFieldAttribute : Attribute {
public string FieldName { private set; get; }
public SQLDbType DBType { private set; get; }
public DBFieldAttribute (string fname, SQLDbType ftype){
FieldName = fname;
DBType = ftype;
}
}

Atrybuty zadeklarowane ale jak ich użyć? Bardzo prosto. Atrybut wpisujemy w nawiasach kwadratowych przed deklaracją elementu do którego się odnoszą:

[DBTable("osoby")] //to jest nasz atrybut
public class DBOsoby : IDBEntity {
[DBField("numer",DQLDBType.Int32)]
public int nr { private set; get; }
...
...
//tutaj jeszcze konstruktory i metody dziedziczone z interfejsu
}

Teraz możemy już odczytać metadane naszej klasy we wspomnianej wcześniej klasie statycznej, ale to już w następnej części...

Jestem dupa nie bloger

Rozpocząłem tego bloga i o nim zapomniałem, co działo się i działo. Teraz skoro już się wydziało, to może wrócę i znowu zacznę pisać z jakimi problemami się spotykam i jak je rozwiązuję (albo i nie). Kilka ciekawych tematów się pojawiło, więc o czym pisać jest. Czasem tylko czasu brakuje...

Obserwatorzy