Кратко о RTTI и атрибутах в Delphi 2010

Malcolm Groves, “RTTI and Attributes in Delphi 2010”, public translation into Russian from English More about this translation.

Translate into another language.

RTTI (Runtime Type Information) было тщательно переработано в Delphi 2010. RTTI является центральным элементом, на котором написано Delphi IDE, он существует со времен первого выпуска, однако я слышал от некоторых людей на протяжении многих лет, что они попытались использовать RTTI и нашли это слишком сложным и замысловатым, особенно по сравнению с Reflection API в Java и. NET. Вот это настоящий позор, поскольку возможность писать код для запроса подробной информации о других объектах, не зная заранее их типа, это действительно мощная возможность.

Однако, я думаю, что жалобы уйдут в прошлое с новым API. Оно было не только расширено, но стало гораздо более доступным и легким в использовании.

Одна из новых особенностей, которой я очень впечатлен - это поддержка атрибутов в среде Win32. Я работаю над большим примером, но здесь мы быстренько рассмотрим создание, а затем запрос пользовательских атрибутов.

Пользовательские атрибуты это просто классы, которые наследованы от TCustomAttribute. Они могут иметь свойства, методы и т.д., как и любой другой класс:

MyAttribute = class(TCustomAttribute)

private

FName: string;

FAge: Integer;

public

constructor Create(const Name : string; Age : Integer);

property Name : string read FName write FName;

property Age : Integer read FAge write FAge;

end;

Здесь никаких неожиданностей, конструктор описан именно так как ты этого ожидал.

Далее мы можем применить наш атрибут к классу:

TMyClass = class

public

[MyAttribute('Malcolm', 39)]

procedure MyProc(const s : string);

[MyAttribute('Julie', 37)]

procedure MyOtherProc;

end;

Здесь я применяю атрибут к обоим методам, но задаю разные параметры атрибуту. Порядок записи параметров соответствует их порядку в конструкторе. Применение атрибутов не ограниченно одними методами, вы можете применять атрибуты в свойствам, классам, к любым другим сущностям.

Конечно, нет смысла добавлять атрибуты, если вы не можете прочитать их откуда-нибудь, так что вот некоторые примеры кода, который использует новый API RTTI для запроса наших атрибутов, а также отображения деталей в ListBox:

procedure TForm3.Button1Click(Sender: TObject);

var

ctx : TRttiContext;

t : TRttiType;

m : TRttiMethod;

a : TCustomAttribute;

begin

ListBox1.Clear;

ctx := TRttiContext.Create;

try

t := ctx.GetType(TMyClass);

for m in t.GetMethods do

for a in m.GetAttributes do

if a is MyAttribute then

ListBox1.Items.Add(Format('Method = %s; Attribute = %s, Name = %s, Age = %d',

[m.Name, a.ClassName, MyAttribute(a).Name,

MyAttribute(a).Age]));

finally

ctx.Free;

end;

end;

Сначала я получил ссылку на RTTI контекст, и загрузил его с помощью ClassType моего класса. Затем я выполнил for..in по методам моего класса, и для каждого метода выполнил for..in по атрибутам. После этого я проверил, является ли атрибут моим пользовательским атрибутом, для них получил значения Name и Age, и отобразил их в списке ListBox.

attribscreenshot

Как я упоминал ранее, я работаю над другим примером, который более полезен, но, надеюсь, этот пример даст вам ощутить вкус некоторых новинок Delphi 2010.

Original (English): RTTI and Attributes in Delphi 2010

Translation: © r3code .

translated.by crowd

Like this translation? Share it or bookmark!