Как определить, имеет ли поле "новый" модификатор через отражение?
Возможный дубликат:
Как определить "новый" modifer на поле с использованием отражения?
Имея следующее объявление
public class B : A
{
public new string Name;
}
как определить, имеет ли поле "новый" модификатор для своего экземпляра FieldInfo
?
Ответы
Ответ 1
Я думаю, вам нужно будет искать иерархию базовых классов для члена с тем же именем, а если нет, то это новое.
Я знаю это уродливо, но в соответствии с комментарием к этому другому ответу на тот же вопрос Как определить "новый" modifer на поле с использованием отражения?, он говорит:
Я посмотрел исходный код ILSpy, они делают то же самое - ходя цепь наследования. Они используют Mono.Cecil, но есть нет специальной информации, недоступной при отражении. Для большего информацию, посмотрите на метод ILSpy AstBuilder.SetNewModifier
.
Вероятно, не то, что вы ожидали, извините за это.
Ответ 2
Для полей таких нет; IL просто:
.field public string Name
и т.д. - поскольку нет понятия виртуальных полей или новостей и т.д. Модификатор new
здесь существует исключительно для компилятора, поскольку вы утверждаете, что признаете, что делаете что-то немного запутанное. Добавление new
здесь подавляет предупреждение о компиляторе (CS0108), но не изменяет IL. Таким образом, вы не можете отличить формально new
d поле от поля, которое было скрыто без new
.
Было бы предпочтительнее, если бы вы ограничились частными полями с общедоступными свойствами доступа. Обратите внимание, что в любом случае: поле в базовом типе все еще существует.