Dari dunia PHP saya telah memutuskan untuk mencoba C #. Saya sudah mencari tetapi tampaknya tidak dapat menemukan jawaban tentang bagaimana melakukan yang setara dengan ini.
$object = new Object();
$vars = get_class_vars(get_class($object));
foreach($vars as $var)
{
doSomething($object->$var);
}
Saya pada dasarnya memiliki Daftar objek. Objek bisa menjadi salah satu dari tiga jenis yang berbeda dan akan memiliki seperangkat properti publik. Saya ingin bisa mendapatkan daftar properti untuk objek, mengulanginya dan kemudian menuliskannya ke file. Saya pikir ini ada hubungannya dengan c # reflection tetapi itu semua baru bagi saya.
Bantuan apa pun akan sangat dihargai.
c#
reflection
m4rc
sumber
sumber
Jawaban:
Ini harus dilakukan:
sumber
System.Reflection
namespacePropertyInfo[] props = input.GetType().GetProperties();
Newtonsoft.Json.JsonConvert
?sumber
Ya, Refleksi akan menjadi cara untuk pergi. Pertama, Anda akan mendapatkan
Type
yang mewakili tipe (saat runtime) dari instance dalam daftar. Anda dapat melakukan ini dengan memanggilGetType
metodeObject
. Karena ada diObject
kelas, itu bisa dipanggil oleh setiap objek di .NET, karena semua jenis berasal dariObject
( well, secara teknis, bukan segalanya , tapi itu tidak penting di sini).Setelah Anda memiliki
Type
instance, Anda dapat memanggilGetProperties
metode untuk mendapatkanPropertyInfo
instance yang mewakili informasi run-timea tentang properti diType
.Catatan, Anda dapat menggunakan kelebihan
GetProperties
untuk membantu mengklasifikasikan mana sifat Anda mengambil.Dari sana, Anda hanya akan menulis informasi ke file.
Kode Anda di atas, diterjemahkan, akan menjadi:
Perhatikan bahwa jika Anda menginginkan informasi metode atau informasi bidang, Anda harus memanggil salah satu dari kelebihan
GetMethods
atauGetFields
metode masing-masing.Juga perhatikan, itu satu hal untuk daftar anggota ke file, tetapi Anda tidak harus menggunakan informasi ini untuk mendorong logika berdasarkan set properti.
Dengan asumsi Anda memiliki kontrol atas implementasi tipe, Anda harus berasal dari kelas dasar umum atau mengimplementasikan antarmuka umum dan membuat panggilan pada mereka (Anda dapat menggunakan
as
atauis
operator untuk membantu menentukan kelas dasar / antarmuka mana Anda bekerja dengan di runtime).Namun, jika Anda tidak mengontrol definisi tipe ini dan harus menggerakkan logika berdasarkan pencocokan pola, maka itu tidak masalah.
sumber
baik, di C # itu mirip. Berikut adalah salah satu contoh paling sederhana (hanya untuk properti publik):
sumber
Untuk mendapatkan nilai properti spesifik dari nama properti
untuk mengakses nilai properti Name dari string name of property
sumber
Anda dapat menggunakan GetType - GetProperties - Linq Foreach :
sumber
Satu solusi garis menggunakan Linq ...
sumber
Berikut ini sesuatu yang saya gunakan untuk mengubah sebuah
IEnumerable<T>
menjadiDataTable
yang berisi kolom yang mewakiliT
properti, dengan satu baris untuk setiap item diIEnumerable
:Ini "agak" terlalu rumit, tetapi sebenarnya cukup bagus untuk melihat apa hasilnya, seperti yang bisa Anda berikan
List<T>
, misalnya:Dan Anda akan mengembalikan DataTable dengan struktur:
Dengan satu baris per item di Anda
List<Car>
sumber
Contoh ini memangkas semua properti string dari suatu objek.
sumber
Saya belum menemukan ini berfungsi, kata objek Aplikasi. Namun saya telah berhasil
sumber
sumber
sumber
Anda dapat mencoba ini:
Setelah setiap array mengimplementasikan antarmuka IEnumerable
sumber