গতিশীলভাবে একটি ExpandoObject- এ বৈশিষ্ট্য যুক্ত করা


232

আমি রানটাইম সময়ে গতিশীলভাবে একটি এক্সপেন্ডোঅবজেক্টে বৈশিষ্ট্য যুক্ত করতে চাই। সুতরাং উদাহরণস্বরূপ স্ট্রিং প্রপার্টি যুক্ত করতে নিউপ্রপকে আমি এমন কিছু লিখতে চাই

var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);

এটি কি সহজেই সম্ভব?


উত্তর:


488
dynamic x = new ExpandoObject();
x.NewProp = string.Empty;

বিকল্পভাবে:

var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add("NewProp", string.Empty);

31
আমি কখনই বুঝতে পারি নি যে এক্সপ্যান্ডো আইডোরিয়াম <স্ট্রিং, অবজেক্ট> প্রয়োগ করে । আমি সর্বদা ভেবেছিলাম কাস্ট এটি অভিধানে অনুলিপি করবেন। তবে আপনার পোস্টটি আমাকে বুঝতে বাধ্য করেছে যে আপনি যদি অভিধানটি পরিবর্তন করেন তবে আপনি অন্তর্নিহিত এক্সপেন্ডোঅবজেক্টও পরিবর্তন করেন! অনেক অনেক ধন্যবাদ
ডিনালন

3
প্রাপ্তিError 53 Cannot convert type 'System.Dynamic.ExpandoObject' to 'System.Collections.Generic.IDictionary<string,string>' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion
TheVillageIdiot

23
এটা IDictionary<string, object>, না IDictionary<string, string>
স্টিফেন ক্লিয়ারি

3
@ ব্যবহারকারী 123456: সম্পত্তির নাম সর্বদা স্ট্রিং থাকে; তারা গতিশীল হতে পারে না। যদি "গতিশীল হয়", এর অর্থ আপনি "রানটাইম অবধি জানা যায় না", তবে আপনাকে দ্বিতীয় উদাহরণটি ব্যবহার করতে হবে। দ্বারা "একটি গতিশীল হয়", আপনি সম্পত্তি মানে যদি মান গতিশীল, তারপর যে ঠিক আছে। একটি গতিশীল মান হ'ল উভয় উদাহরণের জন্য সূক্ষ্মভাবে কাজ করে।
স্টিফেন ক্লিয়ারি

3
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে আপনি যখন ভেরিয়েবল টাইপ হিসাবে IDictionaryব্যবহার করবেন না এমনভাবে কাস্টিং করছেন dynamic
ব্যবহারকারী 3791372


14

এখানে একটি নমুনা সহায়ক শ্রেণি রয়েছে যা একটি অবজেক্টকে রূপান্তর করে এবং প্রদত্ত বস্তুর সমস্ত পাবলিক বৈশিষ্ট্য সহ একটি Expando প্রদান করে।


    public static class dynamicHelper
        {
            public static ExpandoObject convertToExpando(object obj)
            {
                //Get Properties Using Reflections
                BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
                PropertyInfo[] properties = obj.GetType().GetProperties(flags);

                //Add Them to a new Expando
                ExpandoObject expando = new ExpandoObject();
                foreach (PropertyInfo property in properties)
                {
                    AddProperty(expando, property.Name, property.GetValue(obj));
                }

                return expando;
            }

            public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
            {
                //Take use of the IDictionary implementation
                var expandoDict = expando as IDictionary;
                if (expandoDict.ContainsKey(propertyName))
                    expandoDict[propertyName] = propertyValue;
                else
                    expandoDict.Add(propertyName, propertyValue);
            }
        }

ব্যবহার:

//Create Dynamic Object
dynamic expandoObj= dynamicHelper.convertToExpando(myObject);

//Add Custom Properties
dynamicHelper.AddProperty(expandoObj, "dynamicKey", "Some Value");

11
"ভেরিপ্রেডোডিক্ট = আইডেন্টোরিয়াস হিসাবে সম্প্রসারণ;" এই রেখাকে "ভেরি এক্সপ্লোডিক্ট = আইপেন্ডোরি <স্ট্রিং, অবজেক্ট> হিসাবে বিস্তৃত করা দরকার;"
জম জর্জ

0

আমি মনে করি এটি কোনও আদিম মান নির্ধারণ না করে পছন্দসই ধরণের নতুন সম্পত্তি যুক্ত করে, যখন শ্রেণীর সংজ্ঞায় সম্পত্তি সংজ্ঞায়িত করা হয়

var x = new ExpandoObject();
x.NewProp = default(string)

5
আরে মোর্তিজা! কোড-কেবলমাত্র উত্তরগুলি সমস্যার সমাধান করতে পারে তবে তারা কীভাবে এটি সমাধান করে তা ব্যাখ্যা করলে তারা আরও বেশি কার্যকর। আপনার উত্তর সম্পূর্ণরূপে বোঝার জন্য সম্প্রদায়টির তত্ত্বের পাশাপাশি কোড উভয়ই প্রয়োজন।
আরবিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.