| 
| 
 | Вопрос # 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]:<<данный код работает как ожидается? не знаю - я сейчас на работе, проверить не могу - дома посмотрю, но должен по-идее..
 Ⓐ свобода сопротивление солидарность |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |