У меня есть Button
, определенный в Xaml как
<Button Name="button1" />
Я пытаюсь подписаться на событие Click
этого Button
, используя Reflection.Точнее, я хочу вызвать Action<object, EventArgs>
, а внутри обработчика событий я хочу получить доступ к локальной переменной из-за пределов видимости, как это
string testString = "Hello";
Action<object, EventArgs> clickAction = (object sender, EventArgs e) =>
{
MessageBox.Show(testString);
};
Если я это сделаю, на экране появится Hello
clickAction.Invoke(null, null);
Аналогично, если я просто подпишусь на событие Click
, подобное этому, будет отображаться Hello
button1.Click += (sender, e) =>
{
MessageBox.Show(testString);
};
Но если я использую отражение, чтобы подписаться на событие с AddEventHandler
Я не могу получить доступ к testString
и получаю NullReferenceException
в обработчике событий.
Type buttonType = button1.GetType();
EventInfo clickEvent = buttonType.GetEvent("Click");
Delegate clickEventHandler = Delegate.CreateDelegate(clickEvent.EventHandlerType,
null,
clickAction.Method);
clickEvent.AddEventHandler(button1, clickEventHandler);
- Почему это происходит?
- Есть ли исправление Iможно применить, чтобы заставить его работать так, как я хочу?
- Есть ли у меня другой вариант?
Обновление - это то, как метод выглядит полностью
private void MyMethod()
{
string testString = "Hello";
Action<object, EventArgs> clickAction = (object sender, EventArgs e) =>
{
MessageBox.Show(testString);
};
Type buttonType = button1.GetType();
EventInfo clickEvent = buttonType.GetEvent("Click");
Delegate clickEventHandler = Delegate.CreateDelegate(clickEvent.EventHandlerType,
null,
clickAction.Method);
clickEvent.AddEventHandler(button1, clickEventHandler);
}