2016-01-12 12 views
6

के लिए विफल रहता है मैं सही तुलनाकर्ता बनाने के लिए रिकॉर्ड फ़ील्ड के लिए प्रकार प्राप्त करने की कोशिश कर रहा हूं (किसी भी/लगभग किसी भी प्रकार के रिकॉर्ड के लिए सामान्य समाधान के रूप में)। मुझे स्थैतिक सरणी के लिए प्रकार की जानकारी नहीं मिल रही है:आरटीटीआई के साथ रिकॉर्ड फ़ील्ड प्राप्त करना स्थैतिक सरणी

TArrFieldTest = record 
    a: string; 
    b: array[0..3] of byte; 
    end; 

procedure Test; 
var 
    rttiContext: TRttiContext; 
    rttiType: TRttiType; 
    rttiFields: TArray<TRttiField>; 
begin 
    rttiType := rttiContext.GetType(TypeInfo(TArrFieldTest)); 
    rttiFields := rttiType.GetFields; 
    Assert(rttiFields[0].FieldType<>nil); // it's ok 
    Assert(rttiFields[1].FieldType<>nil); // fail here! 
end; 

फ़ील्डटाइप किसी भी प्रकार की स्थिर सरणी के लिए शून्य है। कोई विचार क्या गलत है? या शायद TArray/TDictionary आदि के साथ उपयोग किए जाने वाले रिकॉर्ड के लिए तुलनात्मक बनाने का आसान तरीका है?

+0

यह शॉर्टस्ट्रिंग प्रकारों पर भी लागू होता है (और डेविड हेफरनन का समाधान उनके लिए भी काम करता है)। –

उत्तर

9

आपको आरटीटीआई उपलब्ध कराने के लिए एक प्रकार की घोषणा करने की आवश्यकता है। उदाहरण के लिए:

type 
    TMyStaticArrayOfByte = array[0..3] of byte; 

    TArrFieldTest = record 
    a: string; 
    b: TMyStaticArrayOfByte; 
    end; 
+0

गतिशील सरणी के बारे में जानकारी अलग-अलग प्रकार की घोषणा के बिना उपलब्ध है। स्थिर सरणी के मामले में हमें अलग-अलग प्रकार की घोषणा करनी है, यह एकमात्र तरीका है? जैसा कि मैंने उम्मीद की उतनी अच्छी नहीं है, लेकिन कुछ भी नहीं, धन्यवाद! –

+4

एक गतिशील सरणी एक कंपाइलर प्रबंधित प्रकार है जो अपने स्वयं के आरटीटीआई के साथ है, और इसमें अपने स्वयं के आरटीटीआई के साथ एक अलग प्रकार के तत्व शामिल हैं जो गतिशील सरणी के आरटीटीआई लिंक हैं। एक स्थैतिक सरणी एक प्रकार नहीं है, और इस प्रकार कोई आरटीटीआई नहीं है, जब तक कि आप इसे एक प्रकार न बनाते, अन्यथा यह केवल स्मृति का एक ब्लॉक है। –

+0

यदि मुझे सही तरीके से याद है, तो आपको रेंज को आरटीटीआई के साथ सरणी के आइटम तक पहुंचने के लिए 'MyStaticArrayOfByteRange = 0..3;' के रूप में भी घोषित करना होगा। –

संबंधित मुद्दे