C # Размышление об этом-объекте - PullRequest
2 голосов
/ 28 января 2011

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

public class myClass : myClassIF {

    public myClass() { }

    private void doSomething_A() {
        //...
    }

    private void doSomething_B() {
        //...
    }

    public void DecideAndCall(string identifier) {
        string methodName = "doSomething_" + identifier;
        MethodInfo mi = this.GetType().GetMethod(methodName); //here i got a NullReference??
        //here should be the Invocation of the Method and so on...
    }
}

Интерфейс выглядит так:

public interface myClassIF {

    void DecideAndCall(string identifier);

}

Если я вызываю метод GetMethod ("..."), я всегда получаю NullReference.Я не могу этого понять, потому что в другой части этого проекта я делал это раньше.Но там я использовал Refelction к другому типу, а не к «this».

Возможно ли отразить методы в фактически инстанцированном объекте?Я думаю, что так и должно быть, но я не знаю, как ...

Большое спасибо!Benni

Ответы [ 4 ]

12 голосов
/ 28 января 2011

Метод, который вы хотите получить, является закрытым, но метод Type.GetMethod без параметров ищет только общедоступные методы.Попробуйте перегрузку , которая позволяет указать ограничения привязки:

BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo mi = GetType().GetMethod(methodName, flags);

Я настоятельно рекомендую не делать что-то подобное.Весьма необычно, что объект выполняет отражение на самом .Вы явно теряете безопасность типов;например, предоставленный вами пример будет неэффективным, если аргумент метода будет отличен от "A" или "B".Хотя я уверен, что ваша настоящая программа более сложная, вы уверены, что не сможете изменить ее так, чтобы она не требовала размышлений?

2 голосов
/ 28 января 2011

Вам нужно использовать BindingFlags.NonPublic , чтобы получить доступ к закрытым методам.

2 голосов
/ 28 января 2011

Методы, которые вас интересуют, являются закрытыми, поэтому вам нужно указать BindingFlags.NonPublic в своих аргументах:

public void DecideAndCall(string identifier)
{
    string methodName = "doSomething_" + identifier;

    BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
    MethodInfo mi = this.GetType().GetMethod(methodName, flags);
    // ...
}
1 голос
/ 28 января 2011

Поскольку методы являются частными, вам нужно использовать перегрузку, принимающую BindingFlags

MethodInfo mi = typeof(myClass).GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); 

Это обсуждается более подробно здесь

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