Có một số kịch bản để xem xét. Trước hết, bạn cần kiểm tra loại đối tượng của bạn. Bạn chỉ cần gọi GetType () cho việc này. Nếu loại không triển khai ID ẩnMetaObjectProvider, thì bạn có thể sử dụng sự phản chiếu giống như đối với bất kỳ đối tượng nào khác. Cái gì đó như:
var propertyInfo = test.GetType().GetProperties();
Tuy nhiên, đối với các triển khai ID ẩnMetaObjectProvider, sự phản chiếu đơn giản không hoạt động. Về cơ bản, bạn cần biết thêm về đối tượng này. Nếu đó là ExpandoObject (là một trong những triển khai ID ẩnMetaObjectProvider), bạn có thể sử dụng câu trả lời được cung cấp bởi itowlson. ExpandoObject lưu trữ các thuộc tính của nó trong một từ điển và bạn có thể chỉ cần truyền đối tượng động của mình vào một từ điển.
Nếu đó là DynamicObject (một triển khai ID ẩnMetaObjectProvider khác), thì bạn cần sử dụng bất kỳ phương thức nào mà DynamicObject này trưng ra. DynamicObject không bắt buộc phải thực sự "lưu trữ" danh sách các thuộc tính của nó ở bất cứ đâu. Ví dụ: nó có thể làm một cái gì đó như thế này (tôi đang sử dụng một ví dụ từ bài đăng trên blog của tôi ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
Trong trường hợp này, bất cứ khi nào bạn cố gắng truy cập vào một thuộc tính (với bất kỳ tên đã cho nào), đối tượng chỉ cần trả về tên của thuộc tính dưới dạng một chuỗi.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Vì vậy, bạn không có bất cứ điều gì để phản ánh - đối tượng này không có bất kỳ thuộc tính nào, đồng thời tất cả các tên thuộc tính hợp lệ sẽ hoạt động.
Tôi muốn nói về việc triển khai ID ẩnMetaObjectProvider, bạn cần lọc các triển khai đã biết nơi bạn có thể nhận danh sách các thuộc tính, chẳng hạn như ExpandoObject và bỏ qua (hoặc ném ngoại lệ) cho phần còn lại.