2009-06-23 12 views
5

वैकल्पिक मैं डेल्फी में लिखना चाहते हैं (2009 - तो मैं सामान्य शब्दकोश वर्ग है) कि सी # कोड के लिए कुछ इसी तरह:नेट 'टाइप' वर्ग डेल्फी

Dictionary<Type, Object> d = new Dictionary<Type, Object>(); 
d.Add(typeof(ISomeInterface), new SomeImplementation()); 
object myObject = d[typeof(ISomeInterface)]; 

कोई भी विचार?

अग्रिम धन्यवाद,

ह्रिस्टो

उत्तर

9

इंटरफेस के लिए, आप एक PTypeInfo सूचक है, जो संकलक जादू समारोह TypeInfo द्वारा दिया जाता है का उपयोग करना चाहेंगे। TypInfofo TypInfo इकाई में घोषित किया गया है।

type 
    TInterfaceDictionary = TObjectDictionary<PTypeInfo, TObject>; 
var 
    d: TInterfaceDictionary; 
    myObject: TSomeImplementation; 
begin 
    d := TInterfaceDictionary.Create([doOwnsValues]); 
    d.Add(TypeInfo(ISomeInterface), TSomeImplementation.Create()); 
    myObject = d[TypeInfo(ISomeInterface)]; 
end; 

बेशक, यदि यह इंटरफेस के बजाय कक्षाएं थी, तो आप केवल एक TClass संदर्भ का उपयोग कर सकते थे।

+0

धन्यवाद, मेसन। यह वह समाधान है जिसे मैं ढूंढ रहा था। असल में मैं रजिस्ट्री डिज़ाइन पैटर्न का एक सरल कार्यान्वयन तैयार कर रहा हूं और मैं चाहता हूं कि मेरा कोड कुछ ऐसा दिखने के लिए: रजिस्ट्री। रजिस्ट्रार कॉम्पोनेंट (TSomeImplementation.Create); // या शायद यहां तक ​​कि: रजिस्टरकंपोनेंट (TSomeImplementation); । । । आईएसओएमइंटरफेस i: = रजिस्ट्री.गेटकंपोनेंट ; @ उवे राबे: यह जानना दिलचस्प है कि यह संभव है लेकिन मेरे मामले में इंटरफेस में कोई GUID नहीं है। –

+0

एक साइड नोट के रूप में, मैं पिछले महीने डेल्फी लाइव कॉन्फ्रेंस में था, और बैरी केली ने एक नए उन्नत आरटीटीआई मॉडल पर एक प्रस्तुति दी जो कि डेल्फी 2010 में होना चाहिए। यह मौजूदा फ़ंक्शन सेट से बहुत अधिक है, और बहुत कुछ के साथ काम करना आसान है। –

6

तो यह वास्तव में एक TInterfaceDictionary है आप इसे इस प्रकार लिख सकते हैं:

type 
    TInterfaceDictionary = TObjectDictionary<TGUID, TObject>; 

जाहिर है यह प्रत्येक इंटरफेस का उपयोग करने के लिए एक GUID की आवश्यकता है।

कारण कुछ संकलक जादू करने के लिए आप यह काफी बस का उपयोग कर सकते हैं:

d.Add(ISomeInterface, TSomeImplementation.Create()); 

(मेसन: नमूना कोड अपहरण के लिए खेद है)

+0

हू। मैंने इसके बारे में सोचा नहीं था। हाँ, यह विशेष रूप से GUID के साथ इंटरफेस के लिए काम करेगा। –