C# и WPF: возможно ли сделать автоматическое понижение аргумента отправителя на основе его типа внутри обработчика событий?

Обычно я знаю, какой конкретный элемент управления вызывает определенное событие, поэтому в обработчике событий я могу сделать ссылку на него путем ручного понижения его параметра отправителя, например, такого (предполагая, что отправитель является кнопкой):

var refToSender = (Button)sender;

Теперь, если по каким-либо причинам я не могу знать точный тип отправителя, можно ли сделать автоматическую загрузку без необходимости использования условных блоков? Другими словами, есть ли возможность написать что-то вроде этого:

var refToUnknownSender = (Magic_here)sender;

1 ответ

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

Type t = sender.GetType();
var myvar = Convert.ChangeType(sender, t);

Myvar теперь кнопка или что-то еще. И все это очень хорошо, пока вы не попытаетесь использовать это в любом коде. Потому что если вы затем попытаетесь использовать что-то, опираясь на этот тип, например:

string senderName = myvar.Name;

У компилятора этого не будет, потому что он не знает, что такое тип senderName, поэтому он не знает, что у него есть свойство Name.

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

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

Другие вопросы по тегам