BindingFlags.IgnoreCase tidak berfungsi untuk Type.GetProperty ()?

183

Bayangkan yang berikut ini

Tipe T memiliki Perusahaan bidang. Saat menjalankan metode berikut ini, ia bekerja dengan sempurna:

Type t = typeof(T);
t.GetProperty("Company")

Dengan panggilan berikut ini saya mendapatkan null

Type t = typeof(T);
t.GetProperty("company", BindingFlags.IgnoreCase)

Adakah yang punya ide?

Boris Callens
sumber
20
@OregonGhost: Apakah penting?
leppie
9
Meskipun pertanyaan meta Anda valid, itu tidak terlalu penting. Karena sebagian besar pertanyaan saya, alasan utama saya adalah lapar akan pengetahuan;)
Boris Callens
1
@ leppie: Ya, benar. Mungkin ada use-case untuk hal ini yang tidak saya sadari, dan selalu menarik mengapa orang ingin melakukan sesuatu.
OregonGhost
21
@OregonGhost: tidak semua bahasa yang menargetkan .Net peka huruf besar-kecil, itu sebabnya Anda terkadang harus melakukan dan melihat-lihat tidak sensitif.
Pop Catalin
2
Gunakan case untuk saya: Jadi saya bisa membandingkan objek dengan MSSQL Compact Entity tanpa khawatir tentang bagaimana mereka mengetik kolom. (Saya membandingkan suatu objek dengan basis data yang ringkas di mana beberapa bidang diberi nama isSomething dan IsSomething.) Dengan kata lain, demi kemalasan.
Teynon

Jawaban:

389

Anda telah menimpa flag pencarian default, jika Anda menentukan flag baru Anda harus memberikan semua info sehingga properti dapat ditemukan. Sebagai contoh:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance

Pop Catalin
sumber
7
ada yang tahu mengapa seperti ini (meminta demi pengetahuan;))
Shrivallabh
2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance adalah flag default ketika Anda hanya memberikan nama properti
Otabek Kholikov
1
@Shrivallabh Menambahkan ke penjelasan OtabekKholikov, jika ingin mempertahankan default ini dan menambahkan (OR) yang Anda tentukan BindingFlagskepada mereka, tidak akan ada cara untuk tidak menggunakan default. Yaitu Tidak mungkin untuk mengecualikan Publicproperti atau mengecualikan Instanceproperti. Mereka memutuskan Anda mengambil default, atau menimpanya dengan menentukan secara tepat apa yang Anda cari.
xr280xr
36

Anda perlu menambahkan BindingFlags.Public | BindingFlags.Instance

leppie
sumber
2
Anda mendapatkan lebih sedikit suara, tetapi Anda 2 menit lebih cepat - tetapi sekali lagi, jawaban Pop memiliki lebih banyak detail. Saya memberikan suara untuk semua yang berhak! :)
Tony Basallo
10

Terima kasih, ini sangat membantu saya dalam keadaan darurat hari ini. Saya memiliki informasi audit yang disimpan, tetapi dengan casing yang salah pada nama properti. (Audit dibangun menjadi datalayer.) Ngomong-ngomong, jadi saya harus menambahkan IgnoreCase sebagai bendera yang mengikat, tetapi kemudian masih tidak berfungsi, sampai rekan kerja saya menemukan jawaban ini. Fungsi yang dihasilkan:

public static void SetProperty(Object R, string propertyName, object value)
{
    Type type = R.GetType();
    object result;
    result = type.InvokeMember(
        propertyName, 
        BindingFlags.SetProperty | 
        BindingFlags.IgnoreCase | 
        BindingFlags.Public | 
        BindingFlags.Instance, 
        null, 
        R, 
        new object[] { value });
}

Ini adalah bagian dari kelas yang saya sebut DotMagic.

Josh Warner-Burke
sumber