Quiero enumerar todas las propiedades: privado, protegido, público, etc. Deseo utilizar las instalaciones integradas y no utilizar ningún código de terceros.¿Cómo enumero todas las propiedades en un objeto y obtengo sus valores?
6
A
Respuesta
5
Uso RTTI extendido como esto (cuando probé el código en XE llegué excepción en la propiedad ComObject, por lo que he insertado intento - a excepción de bloque):
uses RTTI;
procedure TForm1.Button1Click(Sender: TObject);
var
C: TRttiContext;
T: TRttiType;
F: TRttiField;
P: TRttiProperty;
S: string;
begin
T:= C.GetType(TButton);
Memo1.Lines.Add('---- Fields -----');
for F in T.GetFields do begin
S:= F.ToString + ' : ' + F.GetValue(Button1).ToString;
Memo1.Lines.Add(S);
end;
Memo1.Lines.Add('---- Properties -----');
for P in T.GetProperties do begin
try
S:= P.ToString;
S:= S + ' : ' + P.GetValue(Button1).ToString;
Memo1.Lines.Add(S);
except
ShowMessage(S);
end;
end;
end;
7
respuesta de Serg es bueno, pero es mejor evitar excepciones por saltarse algunos tipos:
uses
Rtti, TypInfo;
procedure TForm4.GetObjectProperties(AObject: TObject; AList: TStrings);
var
ctx: TRttiContext;
rType: TRttiType;
rProp: TRttiProperty;
AValue: TValue;
sVal: string;
const
SKIP_PROP_TYPES = [tkUnknown, tkInterface];
begin
if not Assigned(AObject) and not Assigned(AList) then
Exit;
ctx := TRttiContext.Create;
rType := ctx.GetType(AObject.ClassInfo);
for rProp in rType.GetProperties do
begin
if (rProp.IsReadable) and not (rProp.PropertyType.TypeKind in SKIP_PROP_TYPES) then
begin
AValue := rProp.GetValue(AObject);
if AValue.IsEmpty then
begin
sVal := 'nil';
end
else
begin
if AValue.Kind in [tkUString, tkString, tkWString, tkChar, tkWChar] then
sVal := QuotedStr(AValue.ToString)
else
sVal := AValue.ToString;
end;
AList.Add(rProp.Name + '=' + sVal);
end;
end;
end;
2
Aquí es un excelente punto de partida utilizando las capacidades avanzadas de la reciente versión de Delphi:
- Rtti Explorer Lite por RRUZ.
El siguiente enlace se dirige más bien a la versión anterior (de D5 en adelante). Sobre la base de los TypInfo.pas unidad, es limitado, pero todavía instructiva:
Cuestiones relacionadas
- 1. ¿Cómo enumero las propiedades de un objeto JavaScript?
- 2. ¿Cómo se muestran automáticamente todas las propiedades de una clase y sus valores en una cadena?
- 3. ¿Cómo obtener todas las propiedades estáticas y sus valores de una clase que utilizan la reflexión
- 4. cómo averiguar todas las propiedades de un objeto en lua?
- 5. ¿Hay un método .NET incorporado para obtener todas las propiedades y valores para un objeto?
- 6. ¿Cómo obtengo todas las propiedades CSS compatibles en WebKit?
- 7. ¿Listar todas las propiedades del objeto ventana?
- 8. ¿Cómo serializar todas las propiedades de un objeto mapeado-NHibernate?
- 9. ¿Cómo enumero los adaptadores de red y obtengo sus direcciones MAC en Win32 API C++?
- 10. ¿Cómo enumero las claves y valores de una Hashtable?
- 11. ¿Cómo enumerar todas las propiedades de un objeto Powershell?
- 12. Retorno todas las propiedades de un objeto en Objective-C
- 13. ¿Cómo puedo enumerar todas las propiedades del objeto Math?
- 14. ¿Cómo enumero todas las zonas horarias en .NET?
- 15. Reflejo de Javascript: ¿obtiene todas las propiedades de un objeto?
- 16. Cómo configurar DateTime.Kind para todas las propiedades de DateTime en un objeto usando Reflection
- 17. Imprimir todas las propiedades ocultas de un objeto
- 18. Obtener propiedades y valores del objeto desconocido
- 19. ¿Cómo enumero todas las identidades html en un documento con javascript?
- 20. Obtener un diccionario de todas las variables actualmente en su alcance y sus valores
- 21. Cómo copiar todas las propiedades de un objeto a otro objeto, en Python?
- 22. ¿Cómo puedo console.log funciones junto con todas sus propiedades?
- 23. Posible enumerar todas las clases PHP y sus métodos y propiedades?
- 24. Obtener todas las propiedades con los valores de reflexión
- 25. ¿Cómo encontrar las propiedades de un objeto?
- 26. Looping a través de todas las propiedades del objeto php
- 27. ¿Cómo iterar en todas las propiedades de un objeto en C#?
- 28. Grails/Groovy - Objeto de dominio - Mapa de sus propiedades
- 29. PHP copie todas las propiedades de objeto a este
- 30. ¿Cómo enumero todas las tablas en un esquema en Oracle SQL?
¿Con qué versión de Delphi estás trabajando? El RTTI mejorado solo está disponible desde Delphi 2010. Las versiones anteriores no podrán lograrlo: solo se pueden enumerar las propiedades publicadas. –
Usted está preguntando sobre obtener los valores de todas las propiedades. El nuevo RTTI, disponible en Delphi XE2, puede hacer esto. El enlace que publiqué como duplicado fue una referencia sobre el uso de RTTI, en general. No había ninguna indicación de la versión de Delphi que estabas usando. Desde que editó su pregunta, eliminé mi duplicado. –
@DavidHeffernan, gracias por modificar mis preguntas muy bien. – VibeeshanRC