Saya akan meringkas masalah saya ke dalam potongan kode berikut.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
Kode di atas berfungsi dengan baik.
Sekarang saya mencoba yang berikut ini
dynamic dList = list;
Console.WriteLine(dList.First());
tapi saya mendapatkan RuntimeBinderException. Mengapa demikian?
this
dinamis di sini, tetapi jika Anda mendarat di sini, Anda mungkin harus melihat pertanyaan itu jugaJawaban:
Untuk memperluas jawaban Stecya ... metode ekstensi tidak didukung oleh pengetikan dinamis dalam bentuk metode ekstensi , yaitu disebut seolah-olah metode instan. Namun, ini akan berhasil:
Tentu saja, itu mungkin berguna atau tidak. Jika Anda dapat memberikan lebih banyak informasi tentang mengapa dan bagaimana Anda mencoba menggunakan pengetikan dinamis, kami mungkin dapat membantu lebih banyak.
sumber
dynamic
tempat yang benar-benar diperlukan ... pada dasarnya jika Anda mengakses anggota dengan refleksi, itu pertanda besar. Di sisi lain, saya adalah seorang typer statis yang keras - orang lain mungkin menyarankan kebijakan yang kurang pesimis :)Untuk memperluas jawaban Jon, alasan ini tidak berhasil adalah karena dalam metode ekstensi kode non-dinamis biasa bekerja dengan melakukan pencarian penuh dari semua kelas yang diketahui oleh kompilator untuk kelas statis yang memiliki metode ekstensi yang cocok. Pencarian berjalan secara berurutan berdasarkan namespace bersarang dan
using
arahan yang tersedia di setiap namespace.Itu berarti bahwa untuk mendapatkan pemanggilan metode ekstensi dinamis diselesaikan dengan benar, DLR harus tahu pada waktu proses apa semua namespace nestings dan
using
arahan berada di kode sumber Anda . Kami tidak memiliki mekanisme yang berguna untuk menyandikan semua informasi itu ke dalam situs panggilan. Kami mempertimbangkan untuk menciptakan mekanisme seperti itu, tetapi memutuskan bahwa biayanya terlalu tinggi dan menghasilkan terlalu banyak risiko jadwal sehingga tidak layak dilakukan.sumber
dynamic
objek sama dengan C # :,DynamicObject
jadi tidak ada cara untuk membedakannya dan merupakan salah satu alasan mengapa tidak mungkin menambahkan metode ekstensidynamic
, bukan?Karena
First()
bukan metodeList
. Ini didefinisikan dalam Linq Extension keIEnumerable<>
sumber