2015-11-19 6 views
5

के गतिशील सदस्यों का जिक्र करते हुए मैं JSON.NET का उपयोग JSON फ़ाइल को dynamic ऑब्जेक्ट में सी # में deserialize करने के लिए कर रहा हूँ।सी # गतिशील 'ऑब्जेक्ट

एक विधि के अंदर, मैं string में पास करना चाहता हूं और डायनामिक ऑब्जेक्ट में निर्दिष्ट विशेषता का संदर्भ लेना चाहता हूं।

उदाहरण के लिए:

public void Update(string Key, string Value) 
    { 
     File.Key = Value; 
    } 

कहाँ File गतिशील वस्तु है, और Key स्ट्रिंग में पारित हो जाता है वह यह है कि मैं कुंजी "foo" और "बार के एक मूल्य में पारित करने के लिए करना चाहते हैं का कहना है। ", मुझे क्या करना होगा: Update("foo", "bar");, तथापि dynamic ऑब्जेक्ट प्रकार की प्रकृति के कारण, इस

{ 
"Key":"bar" 
} 

में जो परिणाम के रूप में करने का विरोध किया:

{ 
"foo":"bar" 
} 

क्या यह संभव है कि मैं गतिशील वस्तु के साथ क्या पूछ रहा हूं?

उत्तर

4

मैं संदिग्ध आप इस्तेमाल कर सकते हैं:

public void Update(string key, string Value) 
{ 
    File[key] = Value; 
} 

कि कैसे गतिशील वस्तु अनुक्रमण लागू करता है पर निर्भर करता है, लेकिन अगर यह एक Json.NET JObject या इसी तरह की है, मुझे लगता है कि काम करने की उम्मीद होगी। यह समझना महत्वपूर्ण है कि हालांकि सामान्य dynamic अभिव्यक्तियों के लिए काम करने की गारंटी नहीं है।

यदि आपको केवल इस तरह के ऑपरेशन (कम से कम कक्षा के भीतर) की आवश्यकता होती है तो आप फ़ील्ड प्रकार के रूप में JObject का उपयोग करने पर विचार कर सकते हैं, और उसके बाद इसे केवल dynamic के रूप में उजागर करने की आवश्यकता हो सकती है।

+0

आप वास्तव में सही हैं, मैंने इसे लगभग 3 सेकंड तक हराया :) –

+1

@ सेनमिंघम: हालांकि यह स्पष्ट करने के बारे में सुझाव के लिए मेरे उत्तर का अंत देखें। –

+0

बस देखा, धन्यवाद! सर्वोत्तम स्पष्टीकरण के कारण इसे उत्तर के रूप में चिह्नित करेंगे :) –

2

ठीक है तो यह पता चला कि मैं विशेष हूं। यहां उन लोगों के लिए उत्तर दिया गया है जो भविष्य में इस पर ठोकर खा सकते हैं,

बाहर निकलता है आप केवल सरणी अनुक्रमणिका की तरह कुंजी का उपयोग कर सकते हैं और यह पूरी तरह से काम करता है। तो:

File[Key] = Value; तरीके के रूप में करने के लिए File.Key = Value;

धन्यवाद वैसे भी विरोध किया मैं की जरूरत है काम करता है!

+1

वास्तव में सी # और जावास्क्रिप्ट के बीच एक उल्लेखनीय अंतर है कि: यदि आप ऊपर के रूप में

dynamic File = new ExpandoObject(); 

आप एक रनटाइम त्रुटि मिलेगा उदाहरण में File घोषणा करेंगे तो जावास्क्रिप्ट file.Foo में और फाइल [ "फू "] असमान हैं। सी # ने इसे अपनाया है, लेकिन ऐसा लगता है कि एक असंगत तरीके से। विभिन्न घोषणाओं की तुलना के लिए [यह] (http://stackoverflow.com/a/33808136/1016343) उत्तर भी देखें जो काम करेगा (और जो नहीं)। – Matt

1

यदि आप JSON.NET से JObject का उपयोग कर रहे हैं, तो आप इसे कर सकते हैं। यह ExpandoObject के साथ काम नहीं करता है।

उदाहरण:

void Main() 
{ 
    var j = new Newtonsoft.Json.Linq.JObject(); 
    var key = "myKey"; 
    var value = "Hello World!"; 
    j[key] = value; 
    Console.WriteLine(j["myKey"]); 
} 

यह सरल उदाहरण प्रिंट "नमस्ते दुनिया!" जैसा सोचा था। इसलिए

var File = new Newtonsoft.Json.Linq.JObject(); 
public void Update(string key, string Value) 
{ 
    File[key] = Value; 
} 

जो आप उम्मीद करते हैं वह करता है।

CS0021 Cannot apply indexing with [] to an expression of type 'ExpandoObject'

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