Jika IDynamicMetaObjectProvider dapat memberikan nama anggota dinamis, Anda bisa mendapatkannya. Lihat implementasi GetMemberNames di pustaka PCL berlisensi Dynamitey (yang dapat ditemukan di nuget), ia berfungsi untuk ExpandoObject
s dan DynamicObject
s yang mengimplementasikan GetDynamicMemberNames
dan siapa pun IDynamicMetaObjectProvider
yang menyediakan objek meta dengan implementasi GetDynamicMemberNames
tanpa pengujian khusus di luaris IDynamicMetaObjectProvider
.
Setelah mendapatkan nama-nama anggota, itu sedikit lebih banyak pekerjaan untuk mendapatkan nilai dengan cara yang benar, tetapi Impromptu melakukan ini tetapi lebih sulit untuk menunjuk ke bit yang menarik dan membuatnya masuk akal. Berikut dokumentasi dan sama atau lebih cepat dari refleksi, namun, tidak mungkin lebih cepat daripada pencarian kamus untuk ekspansi, tetapi berfungsi untuk objek apa pun, ekspansi, dinamis atau asli - sebut saja.
Dalam kasus ExpandoObject, kelas ExpandoObject sebenarnya mengimplementasikan
IDictionary<string, object>
untuk propertinya, sehingga solusinya sepele seperti casting:Perhatikan bahwa ini tidak akan berfungsi untuk objek dinamis umum. Dalam kasus ini, Anda harus drop down ke DLR melalui IDynamicMetaObjectProvider.
sumber
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:
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 ):
Dalam kasus ini, setiap kali Anda mencoba mengakses properti (dengan nama yang diberikan), objek hanya mengembalikan nama properti sebagai string.
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.
sumber
Membutuhkan Newtonsoft Json.Net
Sedikit terlambat, tetapi saya datang dengan ini. Ini memberi Anda hanya kunci dan kemudian Anda dapat menggunakannya pada dinamis:
Maka Anda cukup foreach seperti ini:
Memilih untuk mendapatkan nilai sebagai string atau objek lain, atau lakukan dinamika lain dan gunakan pencarian lagi.
sumber
JObject attributesAsJObject = dynamicToGetPropertiesFor;
dengan sesuatu seperti:var jObject = (JObject) JToken.FromObject(dynamicToGetPropertiesFor);
. Pada titik itu, Anda bisa mendapatkan kamus nama dan nilai properti dengan melakukan sesuatu sepertivar objProperties = jObject.ToObject<Dictionary<string, object>>();
. Dengan itu di tangan, Anda pergi ke balapan. Ini tidak perlu dinamis. Ini berfungsi baik dengan apa pun yang merupakan subkelas dariDynamicObject