Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с пользовательскими структурами и RTTI в Delphi: решение проблемы с приведением типов

Delphi , Компоненты и Классы , RTTI

Введение

В статье рассматривается проблема работы с пользовательскими структурами и RTTI в Delphi, связанная с приведением типов при использовании пользовательских операторов. Проблема возникает при попытке присваивания свойствам объектов значений из структур с помощью RTTI. Для решения этой проблемы будет предложено использовать механизм конвертеров типов из библиотеки Spring4D.

Контекст проблемы

Разработчик столкнулся с проблемой, когда при попытке присвоения свойств объекта значениями из структуры с помощью RTTI возникала ошибка некорректного приведения типов. Это происходит из-за того, что RTTI не учитывает пользовательские операторы приведения типов, определенные для структур.

Пример кода, вызывающего ошибку

program RecordAssigner;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.Rtti,
  System.SysUtils;
type
  TLength = record
  private
    FValue: Double;
  public
    class operator Implicit(A: Double): TLength;
    class operator Implicit(A: TLength): Double;
    // ... другие операторы
  end;
  // ... определение классов TMyClassNormal и TMyClassInverted
end.
// ... код операторов и классов
// ...
SourceType := LContext.GetType(LNormalObject.ClassInfo);
for LTargetProp in LContext.GetType(LInvertedObject.ClassInfo).GetProperties do
  LTargetProp.SetValue(LInvertedObject, SourceType.GetProperty(LTargetProp.Name).GetValue(LNormalObject));   // Ошибка здесь

Подтвержденное решение

Использование конвертеров типов из библиотеки Spring4D позволяет решить проблему. Необходимо определить конвертеры для преобразования между типом структуры TLength и Double, а также зарегистрировать их в системе конвертеров.

type
  TLengthToDoubleConverter = class(TValueConverter)
  function DoConvertTo(const value: TValue; const targetTypeInfo: PTypeInfo;
    const parameter: TValue): TValue; override;
  end;
  // ... определение TDoubleToLengthConverter
end.
// ... реализация методов конвертеров
procedure InitConverters;
begin
  TValue.ValueConverterCallback := TryConvertTo;
  TValueConverterFactory.RegisterConverter(TypeInfo(TLength), TypeInfo(Double), TLengthToDoubleConverter);
  TValueConverterFactory.RegisterConverter(TypeInfo(Double), TypeInfo(TLength), TDoubleToLengthConverter);
end;

Затем, в цикле присваивания свойств, использовать метод Convert:

for LTargetProp in LContext.GetType(LInvertedObject.ClassInfo).GetProperties do
  LTargetProp.SetValue(LInvertedObject, SourceType.GetProperty(LTargetProp.Name).GetValue(LNormalObject).Convert(LTargetProp.PropertyType.Handle));

Альтернативное решение

Разработчик также предложил альтернативное решение, которое заключается в использовании поддержки пользовательских операторов приведения типов в TValue.TryConvert. Однако, для использования этого решения необходимо применять изменения из ветки feature/implicit_conversion библиотеки Spring4D.

Заключение

В статье были рассмотрены два способа решения проблемы с приведением типов при использовании RTTI в Delphi: использование конвертеров типов из Spring4D и использование поддержки пользовательских операторов приведения типов. Выбор метода зависит от конкретных требований проекта и возможностей используемой версии Delphi.

Создано по материалам из источника по ссылке.

В статье обсуждается проблема, связанная с использованием RTTI и пользовательских типов в Delphi, и предлагаются способы решения этой проблемы, включая использование конвертеров типов из библиотеки Spring4D для корректного приведения типов при присвоении


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: RTTI ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 20:52:18/0.0031719207763672/0