Saya mencoba menerapkan transformasi data menggunakan contoh Reflection 1 dalam kode saya.
The GetSourceValue
fungsi memiliki saklar membandingkan berbagai jenis, tapi saya ingin menghapus jenis dan sifat dan memiliki GetSourceValue
mendapatkan nilai dari properti hanya menggunakan satu string sebagai parameter. Saya ingin meneruskan kelas dan properti di string dan menyelesaikan nilai properti.
Apakah ini mungkin?
c#
reflection
properties
pedrofernandes
sumber
sumber
public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
src.GetType().GetProperty(propName)?.GetValue(src, null);
";).GetProperty
dan throwPropertyNotFoundException
atau sesuatu jika null.)Bagaimana dengan sesuatu yang seperti ini:
Ini akan memungkinkan Anda untuk turun ke properti menggunakan string tunggal, seperti ini:
Anda dapat menggunakan metode ini sebagai metode statis atau ekstensi.
sumber
PropertyInfo.PropertyType
alih-alihobj.GetType()
pada properti bersarang, seperti halnya mengakses properti pada properti bersarang.nameof
ekspresi pada C # 6 seperti ini:nameof(TimeOfDay.Minutes)
pada parameter nama saat memanggil fungsi untuk menghilangkan string ajaib dan menambahkan kompilasi waktu aman untuk panggilan ini.Tambahkan ke sembarang
Class
:Kemudian, Anda dapat menggunakan sebagai:
sumber
SetValue
danGetValue
bekerja denganObject
. Jika Anda perlu bekerja dengan jenis tertentu, Anda harus memberikan hasilGetValue
dan memberikan nilai untuk memberikannyaSetValue
Bagaimana menggunakan
CallByName
satuMicrosoft.VisualBasic
namespace (Microsoft.VisualBasic.dll
)? Ini menggunakan refleksi untuk mendapatkan properti, bidang, dan metode objek normal, objek COM, dan bahkan objek dinamis.lalu
sumber
Jawaban yang bagus oleh jheddings. Saya ingin memperbaikinya memungkinkan referensi array agregat atau koleksi objek, sehingga propertyName bisa menjadi property1.property2 [X] .property3:
sumber
Jika saya menggunakan kode dari Ed S. saya dapatkan
Tampaknya
GetProperty()
tidak tersedia di Xamarin. Bentuk.TargetFrameworkProfile
adaProfile7
di Portable Class Library saya (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin. Android, Xamarin.iOS, Xamarin.iOS Classic).Sekarang saya menemukan solusi yang berfungsi:
Sumber
sumber
Tentang diskusi properti bersarang, Anda dapat menghindari semua hal refleksi jika Anda menggunakan
DataBinder.Eval Method (Object, String)
seperti di bawah ini:Tentu saja, Anda perlu menambahkan referensi ke
System.Web
majelis, tetapi ini mungkin bukan masalah besar.sumber
Metode untuk menelepon telah berubah dalam .NET Standard (pada 1.6). Kita juga bisa menggunakan operator bersyarat nol C # 6.
sumber
? operator
Menggunakan PropertyInfo dari System.Reflection namespace. Refleksi mengkompilasi dengan baik apa pun properti yang kami coba akses. Kesalahan akan muncul saat run-time.
Ini berfungsi dengan baik untuk mendapatkan properti Lokasi objek
Kami akan mendapatkan Lokasi: {X = 71, Y = 27} Kami juga dapat mengembalikan location.X atau location.Y dengan cara yang sama.
sumber
Ini adalah cara untuk mendapatkan semua properti dengan nilainya dalam Daftar.
sumber
type.GetProperty(pi.Name)
ketika itu == ke variabelpi
?if
dan lakukanselfValue?.ToString()
Jika tidak singkirkanif
dan gunakanselfValue==null?null:selfValue.ToString()
List<KeyValuePair<
aneh, gunakan kamusDictionary<string, string>
Kode berikut adalah metode Rekursif untuk menampilkan seluruh hierarki dari semua Nama dan Nilai Properti yang terkandung dalam instance objek. Metode ini menggunakan versi sederhana dari
GetPropertyValue()
jawaban AlexD di atas di utas ini. Berkat utas diskusi ini, saya bisa mengetahui bagaimana melakukan ini!Sebagai contoh, saya menggunakan metode ini untuk menampilkan ledakan atau pembuangan semua properti dalam
WebService
respons dengan memanggil metode sebagai berikut:sumber
sumber
sumber
Metode di bawah ini berfungsi sempurna untuk saya:
Untuk mendapatkan nilai properti:
Untuk mengatur nilai properti:
sumber
sumber
Berikut ini cara lain untuk menemukan properti bersarang yang tidak memerlukan string untuk memberi tahu Anda jalan bersarang. Kredit untuk Ed S. untuk metode properti tunggal.
sumber
Type.GetProperty
kembalinull
daripada meneleponGetValue
danNullReferenceException
melemparkan dalam satu lingkaran.Anda tidak pernah menyebutkan objek apa yang Anda periksa, dan karena Anda menolak objek yang merujuk objek tertentu, saya akan menganggap Anda maksud objek statis.
Perhatikan bahwa saya menandai objek yang sedang diperiksa dengan variabel lokal
obj
.null
artinya statis, jika tidak, atur sesuai keinginan Anda. Perhatikan juga bahwaGetEntryAssembly()
ini adalah salah satu dari beberapa metode yang tersedia untuk mendapatkan rakitan "berjalan", Anda mungkin ingin bermain-main dengannya jika Anda mengalami kesulitan memuat jenis.sumber
Silahkan lihat di Heleonix.Reflection perpustakaan. Anda dapat memperoleh / mengatur / meminta anggota melalui jalur, atau membuat pengambil / penyetel (lambda dikompilasi menjadi delegasi) yang lebih cepat dari refleksi. Sebagai contoh:
Atau buat pengambil dan tembolok untuk digunakan kembali (ini lebih berkinerja tetapi mungkin melempar NullReferenceException jika anggota perantara adalah nol):
Atau jika Anda ingin membuat
List<Action<object, object>>
getter yang berbeda, cukup tentukan tipe dasar untuk delegasi yang dikompilasi (konversi tipe akan ditambahkan ke dalam lambda yang dikompilasi):sumber
cara yang lebih pendek ....
sumber
jheddings dan AlexD keduanya menulis jawaban yang sangat baik tentang cara mengatasi string properti. Saya ingin melempar milik saya ke dalam campuran, karena saya menulis perpustakaan khusus untuk tujuan itu.
Kelas utama Pather.CSharp adalah
Resolver
. Per default itu dapat menyelesaikan entri properti, array dan kamus.Jadi, misalnya, jika Anda memiliki objek seperti ini
dan ingin mendapatkan
Property2
, Anda bisa melakukannya seperti ini:Ini adalah contoh paling mendasar dari jalur yang dapat diselesaikannya. Jika Anda ingin melihat apa lagi yang bisa dilakukan, atau bagaimana Anda bisa memperpanjangnya, cukup buka halaman Github -nya .
sumber
Ini solusinya. Ia bekerja juga dengan objek COM dan memungkinkan untuk mengakses koleksi / array item dari objek COM.
sumber
Inilah yang saya dapatkan berdasarkan jawaban lain. Sedikit berlebihan untuk menjadi sangat spesifik dengan penanganan kesalahan.
sumber