C # में खुद का डायनामिक टाइप या डायनामिक ऑब्जेक्ट कैसे बनाएं?


130

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

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;

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

जवाबों:


279
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 वर्ग के बारे में और अधिक नमूनों के लिए पढ़ें : एक ऑब्जेक्ट का प्रतिनिधित्व करता है जिसके सदस्यों को गतिशील रूप से जोड़ा जा सकता है और रन टाइम पर हटाया जा सकता है।


3
कृपया Visual Studio UserVoice में इस सुविधा के लिए वोट करें ।
orad

33

मुझे हाल ही में इस एक कदम को और आगे ले जाने की आवश्यकता थी, जो कि निर्धारित परिभाषित प्रविष्टियों के आधार पर, गतिशील वस्तु में संपत्ति को जोड़ना था। यहाँ उदाहरण, और Microsoft के ExpandoObject डॉक्यूमेंटेशन से , विशेष रूप से गुणों को गतिशील रूप से जोड़ने के लिए विशेष रूप से संबोधित नहीं करते हैं, लेकिन, आपके द्वारा गुणों की गणना करने और हटाने के तरीकों से अधिभारित किया जा सकता है। किसी भी तरह, मैंने सोचा कि यह किसी के लिए उपयोगी हो सकता है। यहाँ एक अत्यंत सरल संस्करण है कि वास्तव में डायनेमिक गुण को एक्सपेंडेओबजेक्ट (कीवर्ड और अन्य हैंडलिंग को अनदेखा) में कैसे जोड़ा जाए:

        // 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);

32

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;

11

आप नामस्थान 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 पर पाया जा सकता है




7
 var data = new { studentId = 1, StudentName = "abc" };  

या मान मौजूद है

  var data = new { studentId, StudentName };
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.