GetFields производного типа - PullRequest
       4

GetFields производного типа

5 голосов
/ 08 октября 2010

Я пытаюсь отразить поля в производном типе, но он возвращает поля базовый тип.

public class basetype
{
    string basevar;
}

public class derivedtype : basetype
{
    string derivedvar;
}

В некоторых функциях:

derivedtype derived = new derivedtype();

FieldInfo[] fields = derived.GetType().GetFields();

Это вернет basevar, но не будет производным. Я перепробовал все разные привязки, и это, похоже, не имеет значения.

Кроме того, я делаю это в ASP.NET в App_Code, где basevar определен в App_Code, а outputvar - это пользовательский элемент управления, определенный в App_Controls, где типы находятся вне области действия.

Ответы [ 2 ]

10 голосов
/ 08 октября 2010

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

Как и в случае, производный тип не является производным от базового типа

С:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

Возвращает производное.Я только что проверил в LINQPad.

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

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray();
3 голосов
/ 08 октября 2010

Отражение немного странно.

Если элементы являются открытыми, все они видны по всей иерархии.

Если элементы не являются открытыми, необходимо указать BindingFlags.NonPublic, и вы получите только те члены, которые имеют используемый тип.Унаследованные участники не видны.Если вы хотите увидеть всех непубличных членов типа, вам придется пройтись по цепочке наследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...