возможно при использовании RTTI определить, есть ли TRttiMethod
является отмечен как overload
, override
или abstract
?Определить, когда TRttiMethod отмечен как перегрузки, переопределения или абстрактные
благодарит заранее.
возможно при использовании RTTI определить, есть ли TRttiMethod
является отмечен как overload
, override
или abstract
?Определить, когда TRttiMethod отмечен как перегрузки, переопределения или абстрактные
благодарит заранее.
Перегрузка: я не думаю, что для этого есть флаг RTTI, но вы можете проверить, существует ли более одного метода с тем же именем. Это не идеально, но это, вероятно, так близко, как вы собираетесь.
Переопределение: сначала убедитесь, что метод является виртуальным. (Или динамическая или отправка сообщений.) Затем проверьте предков класса для других методов с тем же именем и свойством VirtualIndex.
Резюме: Глубоко в реализации секции rtti.pas, в с кучей флагов данных методов, одна называется mfAbstract
, определяется как 1 shl 7;
. Нет кода, который ссылается на это, но он реализован в RTTI, сгенерированном компилятором. Если у вас есть ссылки TRttiMethod для метода, вы можете проверить это следующим образом:
IsVirtual := PVmtMethodExEntry(method.Handle).Flags and (1 shl 7) <> 0;
PVmtMethodExEntry объявлен в TypInfo
блоке, так что вы должны будете использовать его для того, чтобы работать.
О перегрузке: максимальное количество опубликованных перегруженных методов равно 1, поэтому поиск одного и того же имени не будет работать, не так ли? – NGLN