BindingFlags.IgnoreCase не працює для Type.GetProperty ()?


183

Уявіть наступне

Тип T має поле Компанія. При виконанні наступного методу він відмінно працює:

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

У наступному дзвінку я отримую недійсне значення

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

Хтось отримав ідею?


20
@OregonGhost: це має значення?
леппі

9
Хоча ваш мета-питання є дійсним, він насправді не має значення. Як і більшість моїх запитань, моя основна причина - голод до знань;)
Борис Калленс

1
@leppie: Так, так і є. Можливо, для цього я не знаю корисного випадку, і завжди цікаво, чому люди хочуть робити щось.
OregonGhost

21
@OregonGhost: не всі мови орієнтовані. Мережі залежать від регістру, тому вам потрібно колись робити і нечутливий пошук.
Поп Каталін

2
Використовуйте для мене випадок: Отже, я можу порівнювати об’єкти з компактною сутністю MSSQL, не переживаючи про те, як вони вводяться поля. (Я порівнюю об’єкт із компактною базою даних, де деякі поля мають ім’я isSomething та IsSomething.) Іншими словами, заради лінь.
teynon

Відповіді:


389

Ви перезаписали прапори пошуку за замовчуванням, якщо ви вказуєте нові прапори, вам потрібно надати всю інформацію, щоб знайти властивість. Наприклад:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance


7
хтось має якусь ідею, чому це так (прохання заради знань;))
Shrivallabh

2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance - це прапори за замовчуванням, коли ви
вводите

1
@Shrivallabh Якщо додати пояснення Отабека Холікова, якби зберегти ці параметри за замовчуванням і додати (АБО) вказані BindingFlagsїм дані, не було б способу не використовувати типові настройки. Тобто не можна було б виключити Publicвластивості або виключити Instanceвластивості. Вони вирішили, що ви або приймете параметри за замовчуванням, або замініть їх, вказавши, що саме ви хочете.
xr280xr

36

Вам потрібно додати BindingFlags.Public | BindingFlags.Instance


2
Ви отримуєте менше голосів, але ви були на 2 хвилини швидше - але знову ж таки, у відповіді Попа було детальніше. Я віддаю голоси усім, хто заслуговує! :)
Тоні Базалло

10

Дякую, це дійсно допомогло мені вкрай сьогодні. У мене збереглася інформація про аудит, але з неправильним обкладинкою назви ресурсів. (Аудит вбудований у файл даних.) Так чи інакше, мені довелося додати IgnoreCase як прапорець, але потім він все ще не працював, поки мій колега не знайшов цю відповідь. Отримана функція:

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

Це частина класу, який я називаю DotMagic.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.