C # отражение базового класса проблемы - PullRequest
0 голосов
/ 06 октября 2010

Я хочу получить значение поля базового класса в дочернем классе по имени поля:

class A
{
    protected static double? x;
}

class B : A
{
     B()
       : base()
     {
         x = 13F;       
     }

    void test()
    {
         double? s = this.GetType().
           GetField("x", BindingFlags.NonPublic  | BindingFlags.Static).GetValue(null) as double?;
    }
}

почему у меня возникает TargetException, когда я вызываю метод test ()?

Ответы [ 2 ]

2 голосов
/ 06 октября 2010
double? s = GetType()
            .GetField("x", BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Static)
            .GetValue(null) as double?;

С System.Reflection.BindingFlags:

FlattenHierarchy: указывает, что открытые и защищенные статические члены вверх иерархия должна быть возвращена. Частные статические члены в унаследованных классы не возвращаются. статический члены включают в себя поля, методы, события и свойства. Вложенные типы не возвращаются.

Я полагаю, это просто игрушечный пример для проверки отражения статических элементов в базовых типах? В противном случае кажется немного странным использовать отражение в этом контексте: protected члены видны подклассам. Вы могли бы просто сделать:

double? s = x;
1 голос
/ 06 октября 2010

Добавить BindingFlags.FlattenHierarchy:

       GetField("x", BindingFlags.NonPublic  | BindingFlags.Static | BindingFlags.FlattenHierarchy).GetValue(null) as double?;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...