Отражение частного поля из базового класса

Вот структура:

MyClass: SuperClass2

SuperClass2: SuperClass1

superClass2 находится в Product.Web, а SuperClass1 находится в сборке .NET System.Web

I Я пытаюсь принудительно ввести значение в частное поле bool на SuperClass1. Но что бы я ни пытался, я не могу вернуть поля из отражения.

Я использую следующий код с разными комбинациями BindingFlag, но пока ничего не работает. SuperClass1 - абстрактный класс.

((SuperClass1)this).GetType().GetFields(System.Reflection.BindingFlags.NonPublic);

Примечания: Когда я использую GetProperties (), я получаю хороший большой список, но когда я указываю какие-либо привязки, я ничего не получаю, даже если есть соответствующие свойства. В чем дело?

Кроме того, поле не помечено как внутреннее

Очевидно, я бы использовал GetField (имя строки, BindingFlags), но я даже не могу заставить GetFlags () работать.

Обновление : Я пробовал добавить BindingFlags.Instance, как было предложено, но это не работает (как и ожидалось). Я возвращаю 2 поля, которые происходят от класса, унаследованного от SuperClass1. Возвращает null при использовании с GetField (имя строки, флаги)

Вот код для базового класса. Я пытаюсь получить поле для

public abstract class BaseValidator : Label, IValidator
  {
    private bool propertiesChecked;
...
}
24
задан Dustin Davis 5 August 2011 в 19:53
поделиться

1 ответ

Метод расширения:

/// <summary>
/// Returns the FieldInfo matching 'name' from either type 't' itself or its most-derived 
/// base type (unlike 'System.Type.GetField'). Returns null if no match is found.
/// </summary>
public static FieldInfo GetPrivateField(this Type t, String name)
{
    const BindingFlags bf = BindingFlags.Instance | 
                            BindingFlags.NonPublic | 
                            BindingFlags.DeclaredOnly;

    FieldInfo fi;
    while ((fi = t.GetField(name, bf)) == null && (t = t.BaseType) is Type)
        ;
    return fi;
}
3
ответ дан 28 November 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: