Перейти к содержанию
Fire Monkey от А до Я
  • 0

Записать значение в поле через RTTI


rareMax

Вопрос

(не знаю даже в какой ветке задать вопрос)

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

program DemoGenerator;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Rtti;

Type
  // базовый аттрибут
  DemoDataAttribute = class(TCustomAttribute)
  private
    FGenerator: String;
  public
    constructor Create(Generator: String);
  published
    property Generator: string read FGenerator write FGenerator;
  end;

  // Обслуживаемый класс
  TSomeType = Class
  private
    fPhone: string;
  published
    [DemoData('+1800764328')]
    property Phone: string read fPhone write fPhone;
  End;

  // Управляющий класс
  TMegaSuperClass = Class
    Function Go<T: Class, constructor>: T;
  End;

Procedure Test;
var
  LMsc: TMegaSuperClass;
  New: TSomeType;
Begin
  LMsc := TMegaSuperClass.Create;
  try
    New := LMsc.Go<TSomeType>;
    Writeln('New.Phone: ' + New.Phone);
  finally
    LMsc.Free;
    // New.Free;
  end;
End;

{ DemoDataAttribute }

constructor DemoDataAttribute.Create(Generator: String);
begin
  FGenerator := Generator;
end;

{ TMegaSuperClass }

function TMegaSuperClass.Go<T>: T;
var
  LContext: TRttiContext;
  LClass: TRttiInstanceType;
  LProp: TRttiProperty;
  LAttr: TCustomAttribute;
  LField: TRttiField;
begin
  // Инициализируем РТТИ
  LContext := TRttiContext.Create;
  LClass := LContext.GetType(T) as TRttiInstanceType;
  Writeln('LClass: ' + LClass.ToString);
  // Результат
  Result := T.Create;
  for LProp in LClass.GetProperties do
  begin
    Writeln('LProp: ' + LProp.ToString);
    for LAttr in LProp.GetAttributes do
    begin
      Writeln('LAttr: ' + LAttr.ToString);
      if LAttr is DemoDataAttribute then
      Begin
        Writeln('Attr value: ' + DemoDataAttribute(LAttr).Generator);
        // Как записать значение?
        LProp.SetValue(@Result, DemoDataAttribute(LAttr).Generator);
      End;
    end;
  end;
end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    Test;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

 

Результат консоли:

Цитата

LClass: TSomeType
LProp: property Phone: string
LAttr: DemoDataAttribute
Attr value: +1800764328
New.Phone:

 

Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...