Secara dinamis menambahkan properti ke ExpandoObject


233

Saya ingin menambahkan properti secara dinamis ke ExpandoObject saat runtime. Jadi misalnya untuk menambahkan panggilan properti string NewProp saya ingin menulis sesuatu seperti

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

Apakah ini mudah?


Jawaban:


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

Kalau tidak:

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

32
Saya tidak pernah menyadari bahwa Expando mengimplementasikan IDictionary <string, object>. Saya selalu berpikir bahwa pemeran akan menyalinnya ke kamus. Namun, posting Anda membuat saya mengerti bahwa jika Anda mengubah Kamus, Anda juga mengubah ExpandoObject yang mendasarinya! Terima kasih banyak
Dynalon

3
mendapatkanError 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

24
Ini IDictionary<string, object>, tidak IDictionary<string, string>.
Stephen Cleary

3
@ user123456: Nama properti selalu berupa string; mereka tidak bisa dinamis. Jika dengan "adalah dinamis", maksud Anda "tidak diketahui hingga runtime", maka Anda harus menggunakan contoh kedua. Jika dengan "adalah dinamis", Anda berarti properti nilai dinamis, maka itu baik-baik saja ini. Memiliki nilai dinamis berfungsi dengan baik sebagai contoh.
Stephen Cleary

3
Penting untuk dicatat bahwa ketika Anda melakukan casting karena IDictionaryAnda tidak menggunakan dynamicsebagai tipe variabel.
user3791372


14

Berikut ini adalah contoh kelas pembantu yang mengubah Objek dan mengembalikan Expando dengan semua properti publik dari objek yang diberikan.


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

Pemakaian:

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

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

11
"var expandoDict = expando sebagai IDictionary;" baris ini perlu diubah menjadi "var expandoDict = expando sebagai IDictionary <String, object>;"
Jom George

0

Saya pikir ini menambahkan properti baru dalam tipe yang diinginkan tanpa harus menetapkan nilai primitif, seperti ketika properti didefinisikan dalam definisi kelas

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

5
Hai Morteza! Jawaban hanya kode dapat memecahkan masalah tetapi mereka jauh lebih berguna jika Anda menjelaskan bagaimana mereka menyelesaikannya. Komunitas membutuhkan teori dan kode untuk memahami jawaban Anda sepenuhnya.
RBT
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.