Tự động thêm thuộc tính vào ExpandoObject


233

Tôi muốn tự động thêm các thuộc tính vào ExpandoObject khi chạy. Vì vậy, ví dụ để thêm một thuộc tính chuỗi gọi NewProp, tôi muốn viết một cái gì đó như

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

Điều này có dễ dàng không?


Câu trả lời:


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

Cách khác:

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

32
Tôi chưa bao giờ nhận ra rằng Expando thực hiện IDadata <string, object>. Tôi đã luôn nghĩ rằng dàn diễn viên sẽ sao chép nó vào một cuốn từ điển. Tuy nhiên, bài đăng của bạn khiến tôi hiểu rằng nếu bạn thay đổi Từ điển, bạn cũng thay đổi ExpandoObject bên dưới! Cảm ơn rất nhiều
Dynalon

3
nhận đượcError 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>, không phải IDictionary<string, string>.
Stephen Cleary

3
@ user123456: Tên thuộc tính luôn là chuỗi; họ không thể năng động. Nếu bởi "là một động", bạn có nghĩa là "không biết đến thời gian chạy", thì bạn phải sử dụng ví dụ thứ hai. Nếu theo "là một động", bạn có nghĩa là giá trị thuộc tính là động, thì điều đó tốt. Có một giá trị động hoạt động tốt cho một trong hai ví dụ.
Stephen Cleary

3
Điều quan trọng cần lưu ý là khi bạn chọn như IDictionarylà bạn không sử dụng dynamiclàm loại biến.
dùng3791372


14

Dưới đây là một lớp trình trợ giúp mẫu để chuyển đổi một Đối tượng và trả về một Expando với tất cả các thuộc tính công khai của đối tượng đã cho.


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

Sử dụng:

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

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

11
"var extendoDict = extendo dưới dạng IDadata;" dòng này cần thay đổi thành "var extendoDict = extendo as IDadata <String, object>;"
Jom George

0

Tôi nghĩ rằng điều này thêm thuộc tính mới trong loại mong muốn mà không phải đặt một giá trị nguyên thủy, như khi thuộc tính được định nghĩa trong định nghĩa lớp

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

5
Này Morteza! Câu trả lời chỉ có mã có thể giải quyết vấn đề nhưng chúng hữu ích hơn nhiều nếu bạn giải thích cách họ giải quyết nó. Cộng đồng đòi hỏi lý thuyết cũng như mã cả để hiểu đầy đủ câu trả lời của bạn.
RBT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.