Bir ExpandoObject öğesine dinamik olarak özellikler ekleme


233

Dinamik olarak çalışma zamanında bir ExpandoObject özellikleri eklemek istiyorum. Örneğin örneğin NewProp bir dize özelliği eklemek için ben gibi bir şey yazmak istiyorum

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

Bu kolayca mümkün mü?


Yanıtlar:


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

Alternatif:

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

32
Expando'nun IDictionary <string, object> uyguladığını hiç fark etmedim . Her zaman oyuncu kadrosunun bir sözlüğe kopyalayacağını düşündüm. Ancak, gönderiniz, Sözlüğü değiştirirseniz, temeldeki ExpandoObject'i de değiştirdiğinizi anlamamı sağladı. Çok teşekkürler
Dynalon

3
almaError 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
Öyle IDictionary<string, object>değil IDictionary<string, string>.
Stephen Cleary

3
@ user123456: Özellik adları her zaman dizgidir; dinamik olamazlar. Eğer "dinamik" ise, "çalışma zamanına kadar bilinmiyor" anlamına gelirse, ikinci örneği kullanmanız gerekir. Eğer "dinamik" ise, özellik değerinin dinamik olduğunu kastediyorsunuz demektir . Dinamik bir değere sahip olmak her iki örnek için de işe yarar.
Stephen Cleary

3
Döküm yaparken değişken türü olarak IDictionarykullanmadığınızı not etmek önemlidir dynamic.
user3791372


14

Burada, bir Nesneyi dönüştüren ve verilen nesnenin tüm ortak özelliklerine sahip bir Expando döndüren örnek bir yardımcı sınıf bulunmaktadır.


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

Kullanımı:

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

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

11
"var expandoDict = IDictionary olarak genişletme;" bu satırın "varictionaryoDict = IDo olarak genişletme <String, object>;"
Jom George

0

Ben bu sınıf tanımında tanımlanmış özellik gibi, ilkel bir değer ayarlamak zorunda kalmadan istediğiniz türde yeni özellik eklemek düşünüyorum

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

5
Selam Morteza! Yalnızca kod yanıtları sorunu çözebilir, ancak nasıl çözdüklerini açıklarsanız çok daha yararlıdır. Topluluk, cevabınızı tam olarak anlamak için hem teori hem de kod gerektirir.
RBT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.