मुझे डेल्फी 10.2 का उपयोग करके एक (सख्त) निजी रिकॉर्ड विधि के लिए RTTIMethod.Visibility = mvPublic
मिलता है। क्या यह एक बग है?मुझे एक निजी रिकॉर्ड विधि के लिए RTTIMethod.Visibility = mvPublic मिलता है। - बग?
अद्यतन 2017-07-12: जारी किया गया समस्या: RSP-18587।
कार्यक्रम आउटपुट रिकॉर्ड और कक्षा के लिए सभी इंस्टेंस सदस्य प्रकारों और दृश्यताएं दिखा रहा है; आरटीटीआई से लौटने की दृश्यता;
program Project1;
{$AppType Console}
{$R *.res}
uses
System.RTTI,
System.StrUtils,
System.SysUtils,
System.TypInfo,
Unit1 in 'Unit1.pas';
{$Region 'IWriter, TWriter'}
type
IWriter = interface
procedure BeginSection(const Value: String = '');
procedure EndSection;
procedure WriteMemberSection(const Value: TRTTIMember);
end;
TWriter = class (TInterfacedObject, IWriter)
strict private
FIndentCount: NativeInt;
strict protected
procedure BeginSection(const Value: String);
procedure EndSection;
procedure WriteLn(const Value: String);
procedure WriteMemberSection(const Value: TRTTIMember);
public
const
IndentStr = ' ';
end;
{ TWriter }
procedure TWriter.BeginSection(const Value: String);
begin
WriteLn(Value);
Inc(FIndentCount);
end;
procedure TWriter.EndSection;
begin
Dec(FIndentCount);
end;
procedure TWriter.WriteLn(const Value: String);
begin
System.WriteLn(DupeString(IndentStr, FIndentCount) + Value);
end;
procedure TWriter.WriteMemberSection(const Value: TRTTIMember);
begin
BeginSection(Value.Name);
try
WriteLn('Visibility: ' + TValue.From<TMemberVisibility>(Value.Visibility).ToString);
finally
EndSection;
end;
end;
{$EndRegion}
{$Region '...'}
procedure Run;
var
Writer: IWriter;
RTTIContext: TRTTIContext;
RTTIType: TRTTIType;
RTTIField: TRTTIField;
RTTIProp: TRTTIProperty;
RTTIMethod: TRTTIMethod;
begin
Writer := TWriter.Create;
RTTIContext := TRTTIContext.Create;
try
RTTIContext.GetType(TypeInfo(TSomeRec));
RTTIContext.GetType(TypeInfo(TSomeClass));
Writer.BeginSection('Types:');
for RTTIType in RTTIContext.GetTypes do
begin
if not RTTIType.Name.Contains('ISome')
and not RTTIType.Name.Contains('TSome') then
Continue;
Writer.BeginSection(RTTIType.QualifiedName);
Writer.BeginSection('Fields:');
for RTTIField in RTTIType.GetFields do
begin
if not RTTIField.Name.EndsWith('Field') then
Continue;
Writer.WriteMemberSection(RTTIField);
end;
Writer.EndSection;
Writer.BeginSection('Properties:');
for RTTIProp in RTTIType.GetProperties do
begin
if not RTTIProp.Name.EndsWith('Property') then
Continue;
Writer.WriteMemberSection(RTTIProp);
end;
Writer.EndSection;
Writer.BeginSection('Methods:');
for RTTIMethod in RTTIType.GetMethods do
begin
if not RTTIMethod.Name.Contains('Procedure')
and not RTTIMethod.Name.Contains('Function') then
Continue;
Writer.WriteMemberSection(RTTIMethod);
end;
Writer.EndSection;
Writer.EndSection;
end;
Writer.EndSection;
finally
RTTIContext.Free;
end;
end;
{$EndRegion}
begin
{$Region '...'}
try
Run;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
ReadLn;
{$EndRegion}
end.
हाँ, यह एक बग जैसा दिखता है। –
मैंने डेल्फी 10.2 और डेल्फी एक्सई 3 में अपना परिणाम दोहराया। –
@ डेव ओलसन: मैंने केवल XE6 और टोक्यो के साथ प्रयास किया, और उसी परिणाम भी प्राप्त हुए। यह अपेक्षाकृत पुरानी बग प्रतीत होता है। –