Я не могу попробовать прямо сейчас, но вам может показаться, что вам нужно GetDeclaredFields
вместо GetFields
.Это должно дать все (экземпляр) поля класса, но не поля предшественника.Если они вам тоже нужны, вам придется рекурсивно пройтись по цепочке наследования.
Как я уже сказал, я не могу попробовать это прямо сейчас, поэтому вам придется убедиться в этом самим, даст ли это вамдоступ к строгим закрытым полям.
Обновление
Обратите внимание, что в вашем объявлении TFoo , даже вы, вероятно, не предполагали, и Field1, иField2 - это переменные класса! .
Просто переформатируйте объявление, и вы поймете, что я имею в виду:
TFoo = class
strict private
class var
Field1: Integer;
Field2: Integer;
private
// etc...
Все, что идет после class var является переменной класса, пока компилятор не встретит var , строгий , закрытый , защищенный и т. д. Попробуйте, и вытакже см. Field2 записывается:
TFoo = class
strict private
class var
Field1: Integer;
var
Field2: Integer;
// etc...
В качестве альтернативы попробуйте:
TFoo = class
strict private
Field2: Integer;
class var
Field1: Integer;
// etc...
Это означает, что GetFields и GetDeclaredFields не имеют никаких проблем со строгимчастные поля .Они просто не возвращают переменные класса.Это имеет смысл, ИМО.Переменные класса не являются членами исследуемого объекта.