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:
- Wyposażamy klasę w atrybut opisujący do jakiej tabeli się odnosi
- Wyposażamy jej pola (właściwości) w atrybuty opisujące da jakich kolumn w tabeli bazodanowej się odnoszą
- 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...
Brak komentarzy:
Prześlij komentarz