Diberikan kelas ini
class Foo
{
// Want to find _bar with reflection
[SomeAttribute]
private string _bar;
public string BigBar
{
get { return this._bar; }
}
}
Saya ingin mencari item pribadi _bar yang akan saya tandai dengan atribut. Apakah itu mungkin?
Saya telah melakukan ini dengan properti di mana saya telah mencari atribut, tetapi tidak pernah bidang anggota pribadi.
Apa bendera pengikat yang harus saya atur untuk mendapatkan bidang pribadi?
c#
.net
reflection
.net-attributes
David Basarab
sumber
sumber
Jawaban:
Gunakan
BindingFlags.NonPublic
danBindingFlags.Instance
panjisumber
Anda dapat melakukannya seperti halnya dengan properti:
sumber
Dapatkan nilai variabel pribadi menggunakan Refleksi:
Tetapkan nilai untuk variabel pribadi menggunakan Refleksi:
Di mana objectForFooClass adalah turunan bukan nol untuk tipe kelas Foo.
sumber
GetInstanceField(typeof(YourClass), instance, "someString") as string
Bagaimana mendapatkan nilai bidang pribadi dalam C #?Satu hal yang perlu Anda perhatikan ketika merefleksikan anggota pribadi adalah bahwa jika aplikasi Anda berjalan dalam kepercayaan sedang (seperti, misalnya, ketika Anda berjalan di lingkungan hosting bersama), ia tidak akan menemukan mereka - yang Opsi BindingFlags.NonPublic hanya akan diabaikan.
sumber
sumber
Sintaks Bagus Dengan Metode Ekstensi
Anda dapat mengakses bidang pribadi apa pun dari jenis sewenang-wenang dengan kode seperti ini:
Untuk itu Anda perlu mendefinisikan metode ekstensi yang akan bekerja untuk Anda:
sumber
Saya menggunakan metode ini secara pribadi
sumber
Berikut adalah beberapa metode ekstensi untuk mendapatkan dan mengatur bidang dan properti pribadi secara sederhana (properti dengan setter):
contoh penggunaan:
Kode:
sumber
Ya, namun Anda perlu mengatur bendera Binding Anda untuk mencari bidang pribadi (jika Anda mencari anggota di luar instance kelas).
Bendera mengikat yang Anda perlukan adalah: System.Reflection.BindingFlags.NonPublic
sumber
Saya menemukan ini saat mencari ini di google jadi saya menyadari saya menabrak posting lama. Namun GetCustomAttributes membutuhkan dua params.
Parameter kedua menentukan apakah Anda ingin mencari hierarki warisan atau tidak
sumber