มีหลายสถานการณ์ที่ต้องพิจารณา ก่อนอื่นคุณต้องตรวจสอบประเภทของวัตถุของคุณ คุณสามารถเรียก GetType () สำหรับสิ่งนี้ หากประเภทไม่ใช้ IDynamicMetaObjectProvider คุณสามารถใช้การสะท้อนเช่นเดียวกับวัตถุอื่น ๆ สิ่งที่ต้องการ:
var propertyInfo = test.GetType().GetProperties();
อย่างไรก็ตามสำหรับการใช้งาน IDynamicMetaObjectProvider การสะท้อนอย่างง่ายจะไม่ทำงาน โดยพื้นฐานแล้วคุณต้องทราบข้อมูลเพิ่มเติมเกี่ยวกับวัตถุนี้ หากเป็น ExpandoObject (ซึ่งเป็นหนึ่งในการนำไปใช้งาน IDynamicMetaObjectProvider) คุณสามารถใช้คำตอบที่ itowlson ให้มาได้ ExpandoObject เก็บคุณสมบัติไว้ในพจนานุกรมและคุณสามารถส่งวัตถุแบบไดนามิกไปยังพจนานุกรมได้
หากเป็น DynamicObject (การใช้งาน IDynamicMetaObjectProvider อื่น) คุณต้องใช้วิธีใดก็ตามที่ DynamicObject เปิดเผย DynamicObject ไม่จำเป็นต้อง "เก็บ" รายการคุณสมบัติไว้ที่ใดก็ได้ ตัวอย่างเช่นอาจทำสิ่งนี้ได้ (ฉันใช้ตัวอย่างจากบล็อกโพสต์ของฉันซ้ำ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
ในกรณีนี้เมื่อใดก็ตามที่คุณพยายามเข้าถึงคุณสมบัติ (ด้วยชื่อที่กำหนด) ออบเจ็กต์จะส่งคืนชื่อของคุณสมบัติเป็นสตริง
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
ดังนั้นคุณไม่มีอะไรจะสะท้อน - วัตถุนี้ไม่มีคุณสมบัติใด ๆ และในขณะเดียวกันชื่อคุณสมบัติที่ถูกต้องทั้งหมดก็จะใช้งานได้
ฉันจะบอกว่าสำหรับการใช้งาน IDynamicMetaObjectProvider คุณต้องกรองการใช้งานที่รู้จักซึ่งคุณสามารถรับรายการคุณสมบัติเช่น ExpandoObject และละเว้น (หรือโยนข้อยกเว้น) สำหรับส่วนที่เหลือ