Không có cách thống nhất để truy vấn các thuộc tính động, thông thường bạn sẽ biết chúng trước thời hạn. Với DynamicObject
, người triển khai có thể ghi đè GetMemberNames
và thường cung cấp cho bạn các thuộc tính, tuy nhiên nó thực sự có nghĩa là gỡ lỗi vì không có yêu cầu rằng nó cung cấp tất cả các thuộc tính. Nếu không, nếu đó là của riêng bạn DynamicObject
bạn chỉ cần phải viết phương pháp của riêng bạn để có được các thuộc tính dựa trên thực hiện năng động của bạn. Ví dụ: ExpandoObject
cho phép bạn truy vấn tất cả thuộc tính bằng giao diện IDictionary
.
Vì vậy, khi bạn có cách để có được các thuộc tính của mình, bạn cần phải thông báo cho DataGrid. Thật không may với một DataGrid, vấn đề với việc thực hiện ICustomTypeDescriptor
để cho DataGrid biết về các thuộc tính của bạn là DataGrid lấy TypeDescriptors bằng cách sử dụng loại không phải là cá thể, mà là một vấn đề đối với các đối tượng động, tuy nhiên thực hiện ITypedList
trên bộ sưu tập của DynamicObjects sẽ làm việc với Rất nhỏ xíu nếu bạn không triển khai giao diện không chung chung IList
trên bộ sưu tập của mình, nó sẽ bị loại bỏ trước khi nó đến điểm mà nó kiểm tra ITypeList
.
Tóm lại, triển khai Bộ sưu tập với ITypedList
và IList
. Với ITypedList
trả về null cho GetListName
và chỉ thực hiện GetItemProperties(PropertyDescriptor[] listAccessors)
; Bỏ qua listAccessors
và trả về một PropertyDescriptorCollection của PropertyDescriptors cho mỗi thành viên được đặt tên dựa trên thể hiện đối tượng động được thể hiện tốt nhất trong danh sách của bạn (rất có thể chỉ là đối tượng đầu tiên). Bạn phải thực hiện một lớp con của PropertyDescriptor, một cách dễ dàng và chung để Get/Set giá trị là sử dụng khuôn khổ opensource Dynamitey
using System;
using System.ComponentModel;
using Dynamitey;
public class DynamicPropertyDescriptor:PropertyDescriptor
{
public DynamicPropertyDescriptor(string name) : base(name, null)
{
}
public override bool CanResetValue(object component)
{
return false;
}
public override object GetValue(object component)
{
return Dynamic.InvokeGet(component, Name);
}
public override void ResetValue(object component)
{
}
public override void SetValue(object component, object value)
{
Dynamic.InvokeSet(component, Name, value);
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override Type ComponentType
{
get { return typeof(object); }
}
public override bool IsReadOnly
{
get { return false; }
}
public override Type PropertyType
{
get
{
return typeof (object);
}
}
}
cũng hoạt động trong winforms. Cảm ơn nhiều! – swe