|
Вопрос # 4 959/ вопрос открыт / |
|
Здравствуйте, товарищи эксперты!
Поставил себе дома на новую машину Delphi 2010 - разбираюсь с новым RTTI.
Собственно вопрос после прочтения цикла статей http://www.tdelphiblog.com/2010/01/2009.html
Могу ли я использовать атрибуты методов и свойств для введения своей структуризации и классификации свойств и методов? Т.е. если я задам свои атрибуты MethodNameAttribute, MethodTypeAttribute, то же самое для свойств - смогу ли я затем с помощью RTTI вывести к примеру в ListBox список пользовательских методов объекта (с типом = 'user', к прпимеру) и т.п. ? Я думаю идея ясна.
Если кто-то работал уже с атрибутами - расскажите пожалуйста подробнее - как это правильно сделать.
Спасибо.
 |
Вопрос задал: mirt.steelwater (статус: Посетитель)
Вопрос отправлен: 26 января 2011, 10:32
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 26 января 2011, 11:33; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 26 января 2011, 10:40 [#1]:
Никто не мешает перечислить в цикле все методы объекта, а потом у каждого спросить его атрибуты. Если есть нужный атрибут - выводим.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mirt.steelwater (статус: Посетитель), 26 января 2011, 11:11 [#2]:
т.е. нужно делать что-то вроде такого?
Type
TMethodAttribute = class (TCustomAttribute)
private
f_Group: String;
f_Name: String;
public
constructor Create(aName: String; aGroup: String = '');
property Group : String read f_Group write f_Group;
property Name : String read f_Name write f_Name;
end;
TMyObject = Class (TObject)
public
[TMethod ('Мой метод №1','user_group')]
procedure MyMethod1;
[TMethod ('Мой метод №2','user_group')]
procedure MyMethod2;
[TMethod ('Мой метод №3','admin_group')]
procedure MyMethod3;
end;
Ⓐ свобода сопротивление солидарность
|
|
mirt.steelwater (статус: Посетитель), 26 января 2011, 11:19 [#3]:
и в отрисовке списка методов:
procedure TForm1.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 TMethodAttribute then
begin
if ( ( TMethodAttribute (a).Group = 'user_group' ) and IsUser (Operator) ) then
ListBox1.Items.Add ( 'метод доступен пользователям: ' + TMethodAttribute (a).Name );
if ( ( TMethodAttribute (a).Group = 'admin_group' ) and IsAdmin (Operator) ) then
ListBox1.Items.Add ( 'метод доступен администраторам: ' + TMethodAttribute (a).Name );
end;
finally
ctx.Free;
end;
end;
насколько верен такой подход?
на данный момент я не использую атрибуты таким образом ни в одном проэкте, просто пытаюсь найти применение новым возможностям языка.
Ⓐ свобода сопротивление солидарность
|
|
Вадим К (статус: Академик), 26 января 2011, 11:28 [#4]:
данный код работает как ожидается?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
mirt.steelwater (статус: Посетитель), 26 января 2011, 11:32 [#5]:
да, еще одно - с циклом вроде понятно
но как мне получить атрибут внутри метода?
т.е. если я хочу при возникновении исключения в методе в описании ошибки добавлять имя метода через атрибут или имя класса через атрибут?
procedure TMyObject.procedure MyMethod1;
begin
try
// ...
except on E: Exception do
raise Exception.CreateFmt ('Ошибка объекта %s в методе %s : '#13#10'%s',[имя класса через атрибут?, имя метода
через атрибут?, E.Message]);
end;
end;
Ⓐ свобода сопротивление солидарность
|
|
mirt.steelwater (статус: Посетитель), 26 января 2011, 11:33 [#6]:
<<данный код работает как ожидается?
не знаю - я сейчас на работе, проверить не могу - дома посмотрю, но должен по-идее..
Ⓐ свобода сопротивление солидарность
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|