การเพิ่มคุณสมบัติแบบไดนามิกไปยัง ExpandoObject


233

ฉันต้องการเพิ่มคุณสมบัติให้กับ ExpandoObject ตอนรันไทม์ ตัวอย่างเช่นการเพิ่มคุณสมบัติสตริงเรียก NewProp ฉันต้องการเขียนบางสิ่งเช่น

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

เป็นไปได้อย่างง่ายดายหรือไม่


คำตอบ:


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

อีกวิธีหนึ่งคือ:

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

32
ฉันไม่เคยรู้เลยว่า Expando ใช้ IDictionary <string, object> ฉันคิดเสมอว่านักแสดงจะคัดลอกไปยังพจนานุกรม อย่างไรก็ตามโพสต์ของคุณทำให้ฉันเข้าใจว่าถ้าคุณเปลี่ยนพจนานุกรมคุณยังเปลี่ยน ExpandoObject พื้นฐาน! ขอบคุณมาก
Dynalon

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

24
มันไม่ได้IDictionary<string, object> IDictionary<string, string>
Stephen Cleary

3
@ user123456: ชื่อคุณสมบัติเป็นสตริงเสมอ พวกเขาไม่สามารถเคลื่อนไหวได้ หากโดย "เป็นแบบไดนามิก" คุณหมายถึง "ไม่รู้จนกระทั่งการใช้งานจริง" ดังนั้นคุณต้องใช้ตัวอย่างที่สอง หากโดย "เป็นแบบไดนามิก" คุณหมายถึงค่าคุณสมบัติเป็นแบบไดนามิกนั่นก็ใช้ได้ การมีค่าไดนามิกทำงานได้ดีตัวอย่างเช่น
Stephen Cleary

3
สิ่งสำคัญคือให้สังเกตว่าเมื่อคุณแคสต์เนื่องจากIDictionaryคุณไม่ได้ใช้dynamicเป็นประเภทตัวแปร
user3791372


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
"var expandoDict = expando เป็น IDictionary;" บรรทัดนี้จำเป็นต้องเปลี่ยนเป็น "var expandoDict = expando เป็น IDictionary <String, object>;"
จอร์จ Jom

0

ฉันคิดว่านี่เพิ่มคุณสมบัติใหม่ในประเภทที่ต้องการโดยไม่ต้องตั้งค่าดั้งเดิมเช่นเมื่อคุณสมบัติกำหนดไว้ในคำจำกัดความของชั้นเรียน

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

5
เฮ้ Morteza! คำตอบที่ใช้รหัสเท่านั้นอาจช่วยแก้ปัญหาได้ แต่ก็มีประโยชน์มากกว่าถ้าคุณอธิบายว่าจะแก้ปัญหาอย่างไร ชุมชนต้องใช้ทฤษฎีและรหัสเพื่อทำความเข้าใจคำตอบของคุณอย่างเต็มที่
RBT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.