Tôi đã xem một bài đăng rất thú vị trên blog Fabio Maulo's. Đây là mã và lỗi nếu bạn không muốn chuyển đến url. Tôi đã xác định một lớp học chung mới như sau:
Đây có phải là một lỗ trong liên kết động trong C# 4?
public class TableStorageInitializer<TTableEntity> where TTableEntity : class, new()
{
public void Initialize()
{
InitializeInstance(new TTableEntity());
}
public void InitializeInstance(dynamic entity)
{
entity.PartitionKey = Guid.NewGuid().ToString();
entity.RowKey = Guid.NewGuid().ToString();
}
}
Lưu ý rằng InitializeInstance chấp nhận một tham số có loại động. Bây giờ để kiểm tra lớp này, tôi định nghĩa một lớp được lồng vào bên trong lớp Chương trình chính của tôi như vậy:
class Program
{
static void Main(string[] args)
{
TableStorageInitializer<MyClass> x = new TableStorageInitializer<MyClass>();
x.Initialize();
}
private class MyClass
{
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTime Timestamp { get; set; }
}
}
Lưu ý: các lớp bên trong "MyClass" được khai báo là private.
Bây giờ nếu tôi chạy mã này, tôi nhận được một Microsoft.CSharp.RuntimeBinder.RuntimeBinderException trên dòng "entity.PartitionKey = Guide.NewGuid(). ToString()".
Phần thú vị, mặc dù là thông điệp của ngoại lệ cho biết "Đối tượng không chứa định nghĩa cho PartitionKey".
alt text http://img697.imageshack.us/img697/4188/testdl.png
Cũng lưu ý rằng nếu bạn thay đổi công cụ sửa đổi của lớp lồng nhau thành công khai, mã sẽ thực thi không có vấn đề gì. Vì vậy, những gì bạn nghĩ rằng thực sự đang xảy ra dưới mui xe? Vui lòng tham khảo bất kỳ tài liệu hướng dẫn nào nếu tài liệu này được ghi ở bất cứ đâu - bạn có thể tìm thấy?
Tôi đã từng nghĩ rằng việc sử dụng năng động là viết tắt của việc sử dụng sự phản chiếu cũ đơn giản. tốt nếu bạn thay thế thực hiện InitializeInstance để sử dụng sự phản chiếu. Bạn sẽ xây dựng trên đó, xin vui lòng? – Galilyou
@Jon: Tôi e rằng tôi vẫn không hiểu các mảng bị mất đi như thế nào khi không triển khai tất cả các thuộc tính giao diện (mặc dù đưa nó vào một 'IList' cho phép bạn gọi 'Đếm' !?) - bạn có thể làm phức tạp không ? * (ngoài ra, ý bạn là 'd.Count' ở trên?) * –
Nevermind, [trả lời câu hỏi của riêng tôi] (http://msdn.microsoft.com/en-us/library/aa288461%28VS.71%29. aspx). –