2012-05-15 6 views
3

나는 TRttiContext.FindType(QualifiedTypeName)을 사용하여 객체를 잡으려고합니다. 여기에 내가있어 무엇 :GetType이 성공했을 때 FindType이 RTTI를 얻지 못하는 이유는 무엇입니까?

program MissingRTTI; 
{$APPTYPE CONSOLE} 
uses System.SysUtils, RTTI, Classes; 
type 
    TMyClass = class(TObject) end; 
var 
    rCtx: TRttiContext; 
    rType: TRttiInstanceType; 
begin 
    rCtx := TRttiContext.Create(); 
    rType := rCtx.GetType(TypeInfo(TMyClass)) as TRttiInstanceType; 
    if (rType <> nil) then begin 
    WriteLn('Type found using TypeInfo'); 
    end; 
    rType := rCtx.FindType(TMyClass.QualifiedClassName) as TRttiInstanceType; 
    if (rType <> nil) then begin 
    WriteLn('Type found using qualified class name.'); 
    end; 
    ReadLn; 
    rCtx.Free(); 
end. 

불행하게도, 단지 rCtx.GetType 원하는 유형을 찾을 것으로 보인다. (필자는 GetTypes를 사용하여 모든 유형을 나열하려고 시도했으나 원하는 유형이 결과 배열에 나타나지 않습니다.)이 유형의 컴파일러에서 RTTI를 내보내도록하는 방법을 아는 사람은 누구입니까?

답변

7

FindType 메서드를 호출하면이 함수가 works only for public types이므로 Rtti 정보가 반환되지 않습니다. 따라서 rType.IsPublicType 속성을 검사하면 반환되는 값은 false입니다.

공용 유형은 공용 (공용으로 인식 됨)의 인터페이스 섹션에 선언되어야합니다. 따라서 TMyClass 클래스 정의를 유닛의 인터페이스 부분으로 이동하면 아무 문제없이 FindType을 사용할 수 있습니다.

+1

감사의 말씀 RRUZ! 멋지다. +1 – conciliator