2010-08-22 31 views
43

Tôi đang cố gắng tìm hiểu tất cả các tính năng mới đi kèm với C# 4.0. Tôi không hiểu sự khác biệt giữa các loại DynamicObjectExpandoObject. Có vẻ như DynamicObject được sử dụng, ví dụ: khi bạn muốn truy cập các biến từ các kịch bản Python và ExpandoObject khi nói chuyện với các đối tượng COM/Office. Tôi có đúng không? Sự khác biệt trong việc sử dụng chúng là gì?C# 4.0 Động vs Expando ... chúng phù hợp ở đâu?

+2

câu trả lời tốt hơn ở đây: http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic –

Trả lời

86

Expando dynamic loại thành viên nào có thể được thêm vào (hoặc bị xóa) khi chạy. dynamic được thiết kế để cho phép .NET tương thích với các loại khi giao tiếp với các ngôn ngữ nhập động như Python và JavaScript.

Vì vậy, nếu bạn cần phải xử lý một loại động: sử dụng dynamic và nếu bạn cần để xử lý dữ liệu động như XML hoặc JSON: sử dụng ExpandoObject

Việc kê khai của một expando cho thấy mối quan hệ giữa năng động và expando :

dynamic expando = new ExpandoObject(); 

Và khả năng thêm một tài sản mới:

expando.SomeNewStringVal = "Hello World!"; 

Đó là dòng cuối cùng của mã tạo ra một thương hiệu chuỗi mới pro perty trong đối tượng expando được gọi là SomeNewStringVal. Kiểu chuỗi được suy ra từ bài tập.

Vì vậy, expando là loại dữ liệu động có thể đại diện cho dữ liệu thay đổi động. Đó là nó trong một nutshell. Here's a deeper look at dynamic and expando.

Hoàn dụ:

using System; 
using System.Dynamic; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic expando = new ExpandoObject(); 
     expando.SomeNewStringVal = "Hello Brave New Whirrled!"; 
     Console.WriteLine(expando.SomeNewStringVal); 

     // more expando coolness/weirdness: 
     var p = expando as IDictionary<String, object>; 
     p["A"] = "New val 1"; 
     p["B"] = "New val 2"; 

     Console.WriteLine(expando.A); 
     Console.WriteLine(expando.B); 
    } 
} 
+5

Mặc dù ông đã chấp nhận nó, tôi nghĩ rằng OP có nghĩa là sự khác biệt giữa DynamicObject và ExpandoObject. – nawfal

+1

Chỉ cần lưu ý điều này không có ích vào thời gian trong thế giới thực. Tôi chỉ sử dụng nó ra API để tạo ra các đối tượng phản ứng dyanmic trước khi tuần tự hóa thành xml hoặc json. Bằng cách này tôi có thể đệ quy thêm các lớp con với các tên thuộc tính riêng biệt mà không cần phải định nghĩa một tấn các thuộc tính rõ ràng. "GroupsL1": [{"GroupingL2 :: [{... – user2326106

+0

[' DynamicObject'] (https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- 4.7) MSDN: * Cung cấp một lớp cơ sở để xác định hành vi động tại thời gian chạy, lớp này phải được kế thừa từ, bạn không thể khởi tạo nó trực tiếp. * Trang MSDN chứa một triển khai 'ExpandoObject' đơn giản dựa trên' DynamicObject' Vì vậy, cả hai loại được sử dụng với ràng buộc trễ, nhưng 'ExpandoObject' là bê tông (và được đóng dấu), trong khi' DynamicObject' chỉ là một lớp cơ sở cho các đối tượng động tùy chỉnh. – Palec

Các vấn đề liên quan