GetProperty BindingFlags.IgnoreCase не будет работать без public и экземпляра в С#

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

Если я напишу нижеприведенный код, он даст null

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

В то же время, если я пишу, это отлично работает. Почему это так?

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

Ответ 1

Перегрузка, которая не принимает BindingFlags, по умолчанию принимает значение BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance. Вот почему он находит это в вашем первом фрагменте.

Если вы укажете BindingFlags, вы должны указать все соответствующие флаги, включающие флаги, чтобы сказать, хотите ли вы видеть публичных членов, хотите ли вы видеть непубличных участников, хотите ли вы видеть экземпляр членов, и хотите ли вы видеть статические члены.

Когда вы просто указываете BindingFlags.IgnoreCase, вы не сказали, что хотите увидеть любой из них, поэтому он ничего не найдет.

Ответ 2

По дизайну Type.GetProperty требуется указать как минимум статический или экземпляр:

• Вы должны указать BindingFlags.Instance или BindingFlags.Static, чтобы получить возврат.

Ответ 3

GetProperty(string name) ищет общедоступное свойство с указанным именем (согласно MSDN), но GetProperty(string, BindingFlags) выполняет поиск указанного свойства, используя указанные ограничения привязки точно так, как вы указали.

Когда вы говорите BindingFlags.IgnoreCase, он просто применяет это значение BindingFlag и ничего больше. Согласно docs, вы должны указать либо BindingFlags.Instance, либо BindingFlags.Static, чтобы получить возврат.