2011-03-05 14 views
5

वहाँ .net में किसी भी तरह से क्रम, यानी पर एक उदाहरण के लिए संपत्तियों की एक शब्दकोश बाध्य करने के लिए, के रूप में अगर आधार वस्तु वर्ग था है एक संपत्ति की तरह:सी # में कार्यावधि में एक टाइप किया वस्तु को expando गुण जोड़ने

public IDictionary Items { get; } 

मैं एक समाधान के लिए एक स्थिर शब्दकोश और विस्तार विधि

void Main() 
{ 
    var x = new object(); 
    x.Props().y = "hello"; 
} 

static class ExpandoExtension { 
    static IDictionary<object, dynamic> props = new Dictionary<object, dynamic>(); 
    public static dynamic Props(this object key) 
    { 
     dynamic o; 
     if (!props.TryGetValue(key, out o)){ 
      o = new ExpandoObject(); 
      props[key] = o; 
     } 
     return o;  
    } 
} 

को शामिल के साथ आए हैं, लेकिन यह एक संदर्भ रखती GC'd रंगमंच की सामग्री संग्रह के रूप में हो रहा से वस्तुओं बंद हो जाता है। असल में, यह मेरे विशेष उपयोग मामले के लिए ठीक है, क्योंकि मैं उन विशेष चीज़ों के साथ समाप्त होने के बाद मैन्युअल रूप से प्रोप को साफ़ कर सकता हूं, लेकिन मुझे आश्चर्य है कि क्या टाई करने के लिए कुछ चालाक तरीका है कचरा संग्रह की अनुमति देते हुए ExpandoObject कुंजी?

उत्तर

11

ConditionalWeakTable<TKey, TValue> Class पर एक नज़र डालें।

ConditionalWeakTable < TKey, TValue > वर्ग रन टाइम पर प्रबंधित वस्तुओं के लिए मनमाने ढंग से गुण संलग्न करने के लिए भाषा संकलनकर्ता सक्षम बनाता है। एक ConditionalWeakTable < TKey, TValue > ऑब्जेक्ट एक शब्दकोश है जो एक प्रबंधित ऑब्जेक्ट को बांधता है, जिसे एक कुंजी द्वारा दर्शाया जाता है, इसकी संलग्न संपत्ति के लिए, जिसे एक मान द्वारा दर्शाया जाता है। ऑब्जेक्ट की चाबियाँ TKey क्लास के व्यक्तिगत उदाहरण हैं जिनके लिए संपत्ति संलग्न है, और इसके मान संबंधित गुणों को आवंटित संपत्ति मान हैं।

अनिवार्य रूप से यह एक शब्दकोश है जहां कुंजी और मूल्य दोनों कमजोर संदर्भित होते हैं, और जब तक कुंजी जीवित होती है तब तक एक मूल्य जीवित रखा जाता है।


static class ExpandoExtensions 
{ 
    private static readonly ConditionalWeakTable<object, ExpandoObject> props = 
     new ConditionalWeakTable<object, ExpandoObject>(); 

    public static dynamic Props(this object key) 
    { 
     return props.GetOrCreateValue(key);  
    } 
} 
+3

मुझे स्वीकार करना होगा कि मुझे यह पता नहीं था कि यह अस्तित्व में है। –

+0

धन्यवाद आदमी, यह सही है – mcintyre321

0

आप वस्तुओं का संदर्भ देने के लिए WeakReference का उपयोग कर सकते हैं ताकि वे अभी भी कचरा एकत्र हो सकें। यद्यपि वस्तुओं को स्वयं नष्ट कर दिया गया है, फिर भी आपको अपने शब्दकोश को हाथ से साफ करना होगा।

+0

मैं इस में एक देखो था, लेकिन दूर यह सोच कर कि वहाँ एक आसान तरीका होना चाहिए आया! उपर्युक्त उदाहरण में, हमें x का उपयोग करके ExpandoObject को खोजने में सक्षम होना होगा, लेकिन वास्तव में प्रोप शब्दकोश में x को स्टोर नहीं करना होगा। इसके आसपास काम करने के लिए मैंने शब्दकोश > का उपयोग करने पर विचार किया, GetHashcode() करके चीजें संग्रहीत किया, और फिर गतिशीलता के लिए सूची के माध्यम से एक खोज कर रहा है जिसमें कुंजी ऑब्जेक्ट को वीक रेफरेंस है। अच्छा नहीं है, और Expandos अभी भी GC'd नहीं मिलता है। मैं एक शब्दकोश > – mcintyre321

+0

@ mcintyre321 के साथ आया: ऐसा लगता है कि आप भाग्यशाली हैं, किसी ने आपके लिए पहले से ही अपनी शब्दकोश चीज़ लागू की है। –