2016-02-25 3 views
2

Я немного смущен о PTypeInfo (и TypeInfo в целом) в Delphi - Delphi 10 Seattle, если быть точным.Delphi: разные PTypeInfo для того же типа

Я столкнулся с следующей проблемой:

У нас есть рамки ORM (на основе Spring4D). Теперь я хочу расширить его возможности для отображения: Nullable integer column в поле Nullable в модели. Столбец содержит NULL, 0 или 1. Mapping функция тривиальна:

  • нуль-> нулевой (пустой Nullable)
  • 0-> ложные
  • 1-> правда

Но Я считаю, что это не имеет значения, я работаю над ORM. Ядро проблемы заключается в том, что для передачи значения используется TValue, и некоторые операции литья выполняются до того, как окончательное значение присваивается полю объекта через RTTI. И там я вижу проблему, которую я могу легко воспроизвести:

Механизм отображения предоставляет указатель PTypeInfo для поля. Пример:

class declaration 
... 
MyBooleanField : Nullable<Boolean>; 

И где-то в коде:

LMyBooleanField.GetTypeInfo ... result is PTypeInfo to Nullable<System.Boolean>. 

А теперь, если я пишу:

LMyBooleanField.GetTypeInfo = TypeInfo(Nullable<Boolean>) 

результат false. И мой последний вопрос: ПОЧЕМУ? Я уверен, что типы равны. Оба они возвращают 'Nullable<System.Boolean>' как его имя.

+2

Можете ли вы предоставить [mcve], пожалуйста, –

+2

Имеет ли тип, обладающий этим свойством, в том же двоичном файле/проекте, что и код сравнения? Если, например, ваш класс данных находится в MyData.dpk и 'LMyBooleanField.GetTypeInfo = TypeInfo (Nullable )' в MyORM.dpk, то это может быть проблемой. Вот почему у нас есть функции, такие как 'IsNullable' и' GetUnderlyingType' в 'Spring.pas'. –

ответ

0

Я думаю, что вы ответите на свой вопрос. Хотя TypeInfo и PTypeInfo являются указателями, они не одно и то же. PTypeInfo - это указатель на местоположение, содержащее указатель типа TypeInfo. Таким образом, LMyBooleanField.GetTypeInfo возвращает указатель на поле, которое указывает на Nullable < Boolean>, а не указатель на Nullable < Boolean> сам.

+2

Ах, фантомный избиратель снова ударил. В любом случае, проголосовать за то, с чем вы не согласны, но, по крайней мере, оставить комментарий почему. Если вы считаете, что я ошибаюсь, скажите так и скажите почему. Простое голосование никому не помогает. – Dsm

+0

Я просветлю вас, как «фантом», «не может быть потрудился потратить 2 минуты на обучение людей. TypeInfo - это функция, которая возвращает указатель на TTypeInfo. PTypeInfo - это указатель на TTypeInfo. Существует PPTypeInfo, который, возможно, получил вы с. – ciuly

+0

@ciuly - спасибо. – Dsm

Смежные вопросы