BindingFlags.IgnoreCase Type.GetProperty () için çalışmıyor?


183

Aşağıdakileri hayal edin

T tipi bir Şirket alanına sahiptir. Aşağıdaki yöntemi uygularken mükemmel çalışır:

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

Aşağıdaki çağrı ile olsa null olsun

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

Bir fikriniz var mı?


20
@OregonGhost: Önemli mi?
leppie

9
Meta sorunuz geçerli olsa da, gerçekten önemli değil. Sorularımın çoğu gibi, birincil nedenim bilgiye
açlıktır

1
@ leppie: Evet, öyle. Belki bunun farkında olmadığım bir kullanım durumu vardır ve insanların neden bir şeyler yapmak istedikleri her zaman ilginçtir.
OregonGhost

21
@OregonGhost: Tüm dil hedefleme .Net büyük / küçük harfe duyarlı değildir, bu yüzden bazen yapmanız gerekir ve duyarsız arama.
Pop Catalin

2
Benim için durum kullanın: Böylece alanları nasıl yazdıklarından endişe etmeden nesneleri MSSQL Compact Entity ile karşılaştırabilirim. (Bazı nesneleri ad isSomething ve IsSomething olduğu bir nesneyi kompakt bir veritabanıyla karşılaştırıyorum.) Başka bir deyişle, tembellik uğruna.
teynon

Yanıtlar:


389

Varsayılan arama bayraklarının üzerine yazdınız, yeni bayraklar belirtirseniz, özelliğin bulunabilmesi için tüm bilgileri sağlamanız gerekir. Örneğin:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance


7
herhangi birinin neden böyle olduğu hakkında bir fikri vardır (bilgi uğruna sormak;))
Shrivallabh

2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance, yalnızca özellik adını
sağladığınızda

1
@Shrivallabh OtabekKholikov'un açıklamasına ekleyerek, bu varsayılanları koruyacak ve belirttiğiniz (VEYA) ' BindingFlagsı onlara ekleyecek olsaydı, varsayılanları kullanmanın bir yolu olmazdı. Yani Publicözellikleri veya özellikleri hariç tutmak mümkün olmazdı Instance. Varsayılanları almanıza ya da tam olarak neyin peşinde olduğunuzu belirterek geçersiz kılmaya karar verdiler.
xr280xr

36

Eklemelisin BindingFlags.Public | BindingFlags.Instance


2
Daha az oy alırsınız, ancak 2 dakika daha hızlıydınız - ama sonra tekrar Pop'un cevabı daha fazla ayrıntıya sahipti. Hak eden herkese oy veriyorum! :)
Tony Basallo

10

Teşekkürler, bu bugün bana gerçekten yardımcı oldu. Denetim bilgileri kaydedildi, ancak mülk adları üzerinde yanlış bir kasa vardı. (Denetim bir veri katmanı içine inşa edilmiştir.) Her neyse, IgnoreCase'i bağlayıcı bir bayrak olarak eklemek zorunda kaldım, ancak iş arkadaşım bu cevabı bulana kadar hala işe yaramadı. Ortaya çıkan işlev:

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 });
}

Bu, DotMagic olarak adlandırdığım bir sınıfın parçası.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.