Ada beberapa skenario untuk dipertimbangkan. Pertama-tama, Anda perlu memeriksa jenis objek Anda. Anda cukup memanggil GetType () untuk ini. Jika jenisnya tidak mengimplementasikan IDynamicMetaObjectProvider, maka Anda dapat menggunakan refleksi yang sama dengan objek lainnya. Sesuatu seperti:
var propertyInfo = test.GetType().GetProperties();
Namun, untuk implementasi IDynamicMetaObjectProvider, refleksi sederhana tidak berfungsi. Pada dasarnya, Anda perlu tahu lebih banyak tentang objek ini. Jika itu adalah ExpandoObject (yang merupakan salah satu implementasi IDynamicMetaObjectProvider), Anda dapat menggunakan jawaban yang disediakan oleh itowlson. ExpandoObject menyimpan propertinya dalam kamus dan Anda bisa dengan mudah memasukkan objek dinamis Anda ke kamus.
Jika DynamicObject (implementasi IDynamicMetaObjectProvider lain), maka Anda perlu menggunakan metode apa pun yang dipaparkan DynamicObject ini. DynamicObject tidak diharuskan untuk benar-benar "menyimpan" daftar propertinya di mana saja. Misalnya, mungkin melakukan sesuatu seperti ini (saya menggunakan kembali contoh dari posting blog saya ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
Dalam kasus ini, setiap kali Anda mencoba mengakses properti (dengan nama yang diberikan), objek hanya mengembalikan nama properti sebagai string.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Jadi, Anda tidak memiliki apa pun untuk dipantulkan - objek ini tidak memiliki properti apa pun, dan pada saat yang sama semua nama properti yang valid akan berfungsi.
Saya akan mengatakan untuk implementasi IDynamicMetaObjectProvider, Anda perlu memfilter implementasi yang dikenal di mana Anda bisa mendapatkan daftar properti, seperti ExpandoObject, dan abaikan (atau lempar pengecualian) untuk sisanya.