2010-09-12 4 views
9

क्या आरटीआई के साथ इंटरफेस की संपत्तियों का पता लगाने का कोई तरीका है?डेल्फी आरटीआई: इंटरफेस के गुणों का अन्वेषण करें?

निम्नलिखित कोड काम नहीं करता:

procedure ExploreProps; 
var 
    Ctx: TRttiContext; 
    RttiType: TRttiType; 
    RttiProp: TRttiProp; 
begin 
    RttiType := Ctx.GetType(TypeInfo(IMyInterface)); 
    for RttiProp in RttiType.GetProperties do 
    Writeln(RttiProp.ToString); 
end; 

किसी को भी एक समाधान कैसे सही ढंग से यह करने के लिए है?

उत्तर

4

इंटरफेस कार्यों का संग्रह है। वे वास्तव में वस्तुओं के तरीके के गुण नहीं है; यह सिंटैक्टिक चीनी का एक सा है जो संकलक आपके लिए कोड लिखना आसान बनाता है। अंतर यह है कि वस्तुओं पर, गुण निजी और संरक्षित सदस्यों तक नियंत्रित पहुंच की अनुमति देते हैं, जबकि इंटरफेस पर, सभी सदस्य सार्वजनिक होते हैं इसलिए गुणों की आवश्यकता नहीं होती है।

+0

ठीक नहीं है, लेकिन में जानने के लिए इंटरफेस तरीकों या तो काम नहीं करता है ... बस RttiType.GetMethods का उपयोग कर लूप के लिए प्रतिस्थापित किया गया, अभी भी कोई परिणाम नहीं है। –

+4

@ क्रिस्टियन: मैंने बस आरटीटीआई सिस्टम के लिए कोड देखा, और मानक पुस्तकालयों में कई इंटरफेस उनके लिए उत्पन्न आरटीटीआई के साथ स्थापित किए गए हैं। मुझे यकीन नहीं है कि अंतरफलक प्रकारों के लिए विस्तारित आरटीटीआई उत्पन्न करने के लिए नियम क्या हैं, क्योंकि यह कक्षाओं या अभिलेखों के लिए विस्तारित आरटीटीआई उत्पन्न करने से अलग है। शायद बैरी केली या एलन बाउर इसका जवाब दे सकते हैं? –

+0

इंटरफ़ेस के तरीकों की रिपोर्ट करने के लिए 'TRttiType.GetMethods()' के लिए एक इंटरफ़ेस प्रकार को '{M +}' लागू करने की आवश्यकता है। –

1

जैसा कि मुझे पता है, सामान्य इंटरफेस के लिए कोई समर्थन नहीं है। आप {$ एम +} जोड़ सकते हैं और फिर पुनः प्रयास करें।

-1

देर से उत्तर, लेकिन आप अपने इंटरफे को TObject में टाइप कर सकते हैं, उदा।

RttiType := Ctx.GetType(TObject(IMyInterface).ClassInfo); 
+0

यह गलत और खतरनाक है। मेमोरी लेआउट इंटरफेस के कारण ऑब्जेक्ट्स पर वापस नहीं डाला जा सकता है। ऑब्जेक्ट पर वापस जाने के लिए आपको इंटरफ़ेस में एक फ़ंक्शन जोड़ना होगा (जैसे @FLICKERs उत्तर में)। –

2

अपने इंटरफेस

function GetObject: TObject; 

में इस समारोह जोड़ें और वर्ग में कार्यान्वित करें। उपयोग RTTI साथ GetObject समारोह दिनचर्या

var 
    obj: IPerson; 
begin 
    obj := TPerson.Create; 
    Count := GetPropList(obj.GetObject.ClassInfo, tkAny, @List); 
end; 

कृपया ध्यान दें कि अपने वर्ग TInterfacedPersistent से विरासत में मिला दिया जाना चाहिए TInterfacedObject

TPerson = class(TInterfacedPersistent, IPerson) 
संबंधित मुद्दे