Поглиблене дослідження спадкоємців TRttiMember (ч. I), властивості і поля, Різне, Програмування, статті

Деякі типи, такі як класи і записи, містять “елементи (members)”, такі як поля, властивості та методи. RTTI інформація починається з TRttiMember , Який надає 4 біта інформації про кожного Елементі.



  1. Ім’я;
  2. Область видимості (private, protected, public, published);
  3. Тип, з яким асоціюється елемент;
  4. Атрибути, що асоціюються з цим елементом.

Цей приклад коду демонструє, як отримати доступ до кожного з них.

program Project4;
{$APPTYPE CONSOLE}
uses
SysUtils, Rtti, TypInfo;
type
TTest = class(TCustomAttribute)
end;
TBook = class(TObject)
private
FTitle: String;
public
[TTest]
property Title : String read FTitle write FTitle;
end;
var
c : TRttiContext;
m : TRttiMember;
{ TExample }
begin
c := TRttiContext.Create;
m := c.GetType(TBook).GetProperty(“Title”);
Writeln(“Name:”,m.Name);
Writeln(“Visibility:”,GetEnumName(TypeInfo(TMemberVisibility),ord(m.Visibility)));
WriteLn(“Parent:”,m.Parent.ToString);
Writeln(“First Attribute:”,m.GetAttributes[0].ToString);
writeln;
m := c.GetType(TBook).GetField(“FTitle”);
WriteLn(“Name:”,m.Name);
WriteLn(“Visibility:”,GetEnumName(TypeInfo(TMemberVisibility),ord(m.Visibility)));
WriteLn(“Parent:”,m.Parent.ToString);
readln;
c.Free;
end.


Результат:


Name:Title
Visibility:mvPublic
Parent:TBook
First Attribute:TTest
Name:FTitle
Visibility:mvPrivate
Parent:TBook

Два основних спадкоємця TRttiMember, Про які я хочу розповісти в цьому пості, – TRttiField і TRttiPropery. Обидва вони дозволяють вам отримати і отримувати і присвоювати значення примірників даного типу. Відповідно, вони обидва мають методи SetValue () і GetValue ().
Наступний код демонструє, як їх використовувати. Якщо ви пропустили моє Введення в TValue, то я раджу вам приділити деякий час, що прочитати його, так як це дозволить пояснити то “чари”, яке буде далі.

 
program Project10;
{$APPTYPE CONSOLE}
uses
SysUtils, Rtti, TypInfo;
type
TBook = class(TObject)
private
FTitle: String;
public
property Title : String read FTitle write FTitle;
end;
var
c : TRttiContext;
p : TRttiProperty;
f : TRttiField;
book : TBook;
v : TValue;
begin
book := TBook.Create;
try
c := TRttiContext.Create;
p := c.GetType(TBook).GetProperty(“Title”);
p.SetValue(Book,”Go, Dog, Go!”);
v := p.GetValue(Book);
Writeln(“Title:”,v.ToString);
f := c.GetType(TBook).GetField(“FTitle”);
f.SetValue(Book,”Green Eggs and Ham”);
v := f.GetValue(Book);
Writeln(“FTitle:”,v.ToString);
readln;
c.Free;
finally
Book.Free;
end;
end.

Результат:

 
Title:Go, Dog, Go!
FTitle:Green Eggs and Ham

Говорячи про властивості (Properties), ви повинні простежити за тим, допускають-ли вони можливість зчитування та запису значення, так як спроба виклику SetValue для не змінюваного властивості викличе виключення EPropReadOnly. TRttiProperty має дві властивості “isReadable” і “isWritable”, які дозволяють вам визначити, яким чином властивість було описано. Наступний код демонструє, як це працює.

program Project10;
{$APPTYPE CONSOLE}
uses
SysUtils, Rtti, TypInfo;
type
TBook = class(TObject)
private
FTitle: String;
FUgly: String;
FAuthor: String;
public
property Title : String read FTitle write FTitle;
property Author : String read FAuthor;
property Ugly : String write FUgly;
end;
var
c : TRttiContext;
p : TRttiProperty;
begin
c := TRttiContext.Create;
try
p := c.GetType(TBook).GetProperty(“Title”);
WriteLn(“Name:”,p.Name);
Writeln(“IsReadable:”,p.IsReadable);
Writeln(“IsWritable:”,p.IsWritable);
writeln;
p := c.GetType(TBook).GetProperty(“Author”);
WriteLn(“Name:”,p.Name);
Writeln(“IsReadable:”,p.IsReadable);
Writeln(“IsWritable:”,p.IsWritable);
writeln;
p := c.GetType(TBook).GetProperty(“Ugly”);
WriteLn(“Name:”,p.Name);
Writeln(“IsReadable:”,p.IsReadable);
Writeln(“IsWritable:”,p.IsWritable);
readln;
finally
c.Free;
end;
end.

Результат:

Name:Title
IsReadable:TRUE
IsWritable:TRUE
Name:Author
IsReadable:TRUE
IsWritable:FALSE
Name:Ugly
IsReadable:FALSE
IsWritable:TRUE

Цей пост в значній мірі відкрив завісу над TRttiField і TRttiProperty, В наступному пості я розповім про TRttiMethod.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*