Как определить, имеет ли поле "новый" модификатор через отражение?

Возможный дубликат:
Как определить "новый" 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.

Было бы предпочтительнее, если бы вы ограничились частными полями с общедоступными свойствами доступа. Обратите внимание, что в любом случае: поле в базовом типе все еще существует.