Secara dinamis menambahkan properti ke ExpandoObject

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);
Stephen Cleary
sumber
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");
Johannes
sumber
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)
Morteza ebrahim nejad
sumber
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