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.