Tôi nghĩ rằng bạn hiểu sai về ý nghĩa của dynamic
. Về cơ bản, khi bạn nói với trình biên dịch rằng kiểu của đối tượng là dynamic
, bạn "hứa" rằng đối tượng khi chạy sẽ hỗ trợ bất kỳ phương thức hoặc thuộc tính nào mà bạn gọi, để đổi lấy trình biên dịch không phàn nàn tại thời gian biên dịch. Bạn cũng hứa rằng bạn sẽ phải đối mặt với những hậu quả nếu bạn phá vỡ lời hứa của bạn.
Khi bạn nói rằng một đối tượng là dynamic
, trình biên dịch không thể đưa ra các giả định về loại, vì vậy nó sử dụng object
, biết rằng bất cứ điều gì có thể được lưu trữ là object
. Khi bạn thực hiện một IEnumerable<dynamic>
, nó trở nên IEnumerable<object>
, với một sự khác biệt đáng kể: bạn có thể gọi bất kỳ phương pháp trên các yếu tố của nó, và trình biên dịch sẽ không nói một lời:
IEnumerable<SomeType> original = ...
foreach (dynamic x in original.AsDynamic()) { // Using your method
Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent!
}
Kể từ original.AsDynamic()
đưa ra một chuỗi các dynamic
đối tượng, các trình biên dịch không phàn nàn về cuộc gọi của bạn tới SomeUnsupportedMethod
.Nếu phương pháp này thực sự không được hỗ trợ trong thời gian chạy, chương trình sẽ sụp đổ; nếu phương thức này thực sự được hỗ trợ bởi các phần tử của SomeType
, sẽ không có sự cố và phương thức sẽ được gọi.
Đó là tất cả các dynamic
sẽ làm cho bạn; tĩnh, "trình giữ chỗ" sẽ giữ nguyên là object
và typeof
sẽ cho bạn biết nhiều. Nhưng các khả năng chính xác của đối tượng (các phương thức và thuộc tính của nó) sẽ không được kiểm tra cho đến khi chạy.
["Trong hầu hết các trường hợp, nó hoạt động giống như nó có đối tượng kiểu."] (Http://msdn.microsoft.com/en-us/library/dd264736.aspx) –
Không có loại 'động' khi chạy , chúng chỉ được nhập là đối tượng và thông tin liên kết phương thức là đầu ra tại mỗi trang cuộc gọi liên quan đến một biến động. – Lee