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
, чтобы получить возврат.