почему я, используя Type.GetField(), всегда возвращаю null?

Я использую GetField() для получения селена PID, но когда я пытаюсь получить «ProcessId», он всегда возвращает ноль, вижу, что поле img, ProcessId не пусто. Вот мой код:

public void tes(ChromeDriver driver) {
            var flag = System.Reflection.BindingFlags.NonPublic
                          | System.Reflection.BindingFlags.Instance;
            var executorField = typeof(OpenQA.Selenium.Remote.RemoteWebDriver)
                .GetField("executor",
                          System.Reflection.BindingFlags.NonPublic
                          | System.Reflection.BindingFlags.Instance);
            object executor = executorField.GetValue(driver);
            var Service = executor.GetType().GetField("service", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            object remoteServerPidField = Service.GetValue(executor);
            var pid = remoteServerPidField.GetType().GetField("ProcessId", BindingFlags.Instance | BindingFlags.Static);
        }

введите здесь описание изображения


person Naruto Lee    schedule 14.04.2018    source источник
comment
Ваш remoteServerPidField или remoteServerPidField.GetType() возвращает ненулевое значение?   -  person user9405863    schedule 14.04.2018
comment
remoteServerPidField и remoteServerPidField.GetType() не пусты.   -  person Naruto Lee    schedule 14.04.2018
comment
Это поле или свойство? Вместо этого попробуйте .GetProperty.   -  person    schedule 14.04.2018
comment
может быть, это свойство, я использую GetProperty(), оно не равно null, как я могу получить значение??   -  person Naruto Lee    schedule 14.04.2018


Ответы (1)


ProcessId - это не поле, это свойство. Вместо этого вы должны использовать .GetProperty.

Тем не менее, свойство является общедоступным, и у вас уже есть экземпляр службы, поэтому я не уверен, зачем вам нужно отражение здесь -

var service = executor.GetType()
                .GetField("service", BindingFlags.NonPublic | BindingFlags.Instance)
                .GetValue(executor) as ... ; // whatever type the 'service' is

var pid = service?.ProcessId;
person Community    schedule 14.04.2018
comment
Спасибо @Lyosha Korogoda, все работает, я использую var PidGet = remoteServerPidField.GetType().GetProperty(ProcessId); int pid = (int)PidGet.GetValue(remoteServerPidField, null); Он правильно вернул результат. - person Naruto Lee; 17.04.2018