2012-10-15 5 views
3

는 델파이 XE3에서 RTTI와 몇 가지 작업을하고있어 지금까지 다음과 같이이 프로 시저를 호출 결과는 :delphi에서 RTTI 사용을 단순화 할 수 있습니까?

procedure MyProc(ARecordInstance : pointer; ARecordType : PTypeInfo); 

을 다음과 같이 나는이 루틴을 호출 :

MyProc(@MyRec TypeInfo(TMyRec)); 

이 모든 것이 정상적으로 작동합니다.

내가 내 절차를 간소화 할 수있을 것을 나에게 발생

procedure MyProc(var ARecord); or procedure MyProc(ARecord : pointer); 

내 프로 시저 내 ARecord에서 유형 정보를 얻을 수 있습니다 ..if. 하지만 'ARecord'와 같은 '인스턴스'로 작업하면 TypeInfo는 '유형 식별자가 필요합니다'라는 오류를 표시합니다. 내 레코드에 단일 포인터 참조를 전달하고 그 형식을 추출 할 수있는 방법이 있습니까?

감사

답변

4

여러 유형을 지원해야하는 경우, 당신은 일반 매개 변수, 다음 절차가 작업되는 데이터가 입력 알 수있다 클래스, 예를 들면 내부에 프로 시저를 래핑 할 수 있습니다

type 
    MyClass<T> = class 
    public 
    class procedure MyProc(var AInstance : T); 
    end; 

class procedure MyClass<T>.MyProc(var AInstance : T); 
var 
    InstanceType: PTypeInfo; 
begin 
    InstanceType := TypeInfo(T); 
    //... 
end; 

.

MyClass<TMyRec>.MyProc(MyRec); 
+0

+1 이것은 내가 알아 낸 유일한 방법입니다. 그러나 MyClass .MyProc (MyRec)와 MyProc (MyRec, TypeInfo (TMyRec)) ... 및 일반 버전 간의 더 큰 이점은 더 많은 코드를 생성하며 generics에 대한 Delphi 컴파일러의 불안정성이 있습니다. 그러나 당신은 그것의 가치가 있을지도 모른다 강한 타이핑 체크를 얻을 것이다. –

+0

델파이의 단점에 오신 것을 환영합니다. 이것이 C++ 질문이었을 경우, 컴파일러는 명시 적으로 표현할 필요없이'T'의 값을 자동으로 처리 할 수 ​​있고, 일반적인 코드를 작성하려면'MyProc'를 클래스에 래핑 할 필요가 없습니다 :-) –

0

왜 않은 입력 VAR 매개 변수뿐만 아니라 코드 :

procedure MyProc(var ARecordInstance; ARecordType : PTypeInfo); 
begin 
    ... 

당신은 전화를 할 수있을 것입니다 :

MyProc(MyRec,TypeInfo(TMyRec)); 

그래서 @MyRec를 입력하지 마십시오. 그러나 당신은 또한 강력한 타입 검사를하지 않을 것입니다.

레미가 제안한 제네릭을 사용하면 강력한 입력이 가능하지만 좀 더 많은 코드가 생성됩니다.

+1

질문의 핵심은 명시 적 매개 변수로'TypeInfo (TMyRec)'를 지정하고 싶지 않다는 것입니다. 그는 어떤 레코드 유형이 'ARecordInstance' 매개 변수에 전달되는지에 따라 자동으로 코드를 찾아 내기를 원합니다 . –

관련 문제