2012-10-03 16 views
85

उदाहरण के लिए, ViewBagControllerBase वर्ग की संपत्ति है और हम गतिशील रूप से मूल्यों को प्राप्त/सेट कर सकते हैं और इस ऑब्जेक्ट में किसी भी अतिरिक्त फ़ील्ड या गुण जोड़ सकते हैं, जो कि अच्छा है। मैं ऐसा कुछ उपयोग करना चाहता हूं, एमवीसी अनुप्रयोग से परे और Controller अन्य प्रकार के अनुप्रयोगों में कक्षा। जब मैं dynamic वस्तु बनाने की कोशिश की और सेट यह नीचे की तरह संपत्ति है:सी # में अपने गतिशील प्रकार या गतिशील वस्तु कैसे बनाएं?

1. dynamic MyDynamic = new { A="a" }; 
2. MyDynamic.A = "asd"; 
3. Console.WriteLine(MyDynamic.A); 

मैं के साथ संदेश संपत्ति या इंडेक्सर RuntimeBinderException मिल गया है '<> f__AnonymousType0.A' को सौंपा नहीं जा सकता है - यह केवल पढ़ा जाता है लाइन 2 में भी। मैं सुझाव देता हूं कि यह काफी नहीं है जो मैं देख रहा हूं। शायद कुछ वर्ग है जो मुझे कुछ ऐसा करने की अनुमति दे सकता है:

??? MyDynamic = new ???(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = DateTime.Now; 
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42; 

गतिशील जोड़ने और सेटिंग गुणों के साथ।

उत्तर

181
dynamic MyDynamic = new System.Dynamic.ExpandoObject(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = "C"; 
MyDynamic.Number = 12; 
MyDynamic.MyMethod = new Func<int>(() => 
{ 
    return 55; 
}); 
Console.WriteLine(MyDynamic.MyMethod()); 

अधिक ExpandoObject class के बारे में और अधिक नमूनों के लिए पढ़ें: एक वस्तु जिसके सदस्य गतिशील रूप से जोड़ा और रन टाइम पर हटाया जा सकता है प्रतिनिधित्व करता है।

+2

कृपया दृश्य स्टूडियो [UserVoice] (https इस सुविधा के लिए वोट: यहां बताया ExpandoObject (अनदेखी कीवर्ड और अन्य हैंडलिंग) करने के लिए सही मायने में गतिशील गुण जोड़ने के लिए की एक अत्यंत सरलीकृत संस्करण है। कॉम/फ़ोरम/121,579 विजुअल स्टूडियो/सुझाव/7,062,098 समर्थन वस्तु initializers-ऑन-expandoobjects)। – orad

28

ExpandoObject आप क्या देख रहे हैं।

dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking. 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = "C"; 
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42; 
9

आप ExpandoObject Class जो System.Dynamic नाम स्थान में है का उपयोग कर सकते हैं।

dynamic MyDynamic = new ExpandoObject(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = "C"; 
MyDynamic.SomeProperty = SomeValue 
MyDynamic.number = 10; 
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; }); 

अधिक जानकारी ExpandoObject MSDN

15

में पाया जा सकता मैंने हाल ही में गतिशील वस्तु में संपत्ति या जुड़ाव करने के लिए गया था जो इस एक कदम आगे ले जाने की जरूरत थी, खुद को गतिशील, उपयोगकर्ता के आधार पर परिभाषित प्रविष्टियों। यहां उदाहरण, और Microsoft's ExpandoObject documentation से, विशेष रूप से गुणों को गतिशील रूप से जोड़ने का पता नहीं लगाते हैं, लेकिन, यह अनुमान लगाया जा सकता है कि आप गुणों को कैसे गणना और हटाते हैं। किसी भी तरह, मैंने सोचा कि यह किसी के लिए सहायक हो सकता है। //visualstudio.uservoice:

 // my pretend dataset 
     List<string> fields = new List<string>(); 
     // my 'columns' 
     fields.Add("this_thing"); 
     fields.Add("that_thing"); 
     fields.Add("the_other"); 

     dynamic exo = new System.Dynamic.ExpandoObject(); 

     foreach (string field in fields) 
     { 
      ((IDictionary<String, Object>)exo).Add(field, field + "_data"); 
     } 

     // output - from Json.Net NuGet package 
     textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo); 
संबंधित मुद्दे