Получение цели действий - PullRequest
6 голосов
/ 28 ноября 2011

Я создал следующий образец кода:

class Program {
    static void Main(string[] args) {
        var x = new ActionTestClass();
        x.ActionTest();
        var y = x.Act.Target;
    }
}

public class ActionTestClass {
    public Action Act;
    public void ActionTest() {
        this.Act = new Action(this.ActionMethod);
    }

    private void ActionMethod() {
        MessageBox.Show("This is a test.");
    }
}

Когда я делаю это таким образом, у будет объект типа ActionTestClass (который создан для х). Теперь, когда я меняю строку

this.Act = new Action(this.ActionMethod);

до

this.Act = new Action(() => MessageBox.Show("This is a test."));

y (цель действия) будет нулевым. Есть ли способ, которым я могу получить Target (в примере ActionTestClass-объект) также при использовании Anonymous Action?

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

Отсутствие Target (iow == null) подразумевает, что делегат либо вызывает метод static, либо среда не была захвачена (iow не замыкание, просто «указатель на функцию»).

0 голосов
/ 28 ноября 2011

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

public void ActionTest()
    {
        this.Act = delegate {
            Console.WriteLine("This is a test.");
        };
    }
0 голосов
/ 28 ноября 2011

Вы можете использовать следующее:

Act.Method.DeclaringType
...