Вот более чистая (и более четкая) версия вашего исходного кода.Он не использует никаких отражений, обобщений или вызовов ToString.Вместо этого он использует шаблон сопоставления оператор переключения:
public static string ReturnText(Control control)
{
switch (control)
{
case TextBox tb:
return tb.Text;
case ComboBox cb:
return cb.SelectedText;
//etc.
default: return string.Empty;
}
}
Кстати, вы используете имя controller
для переменной типа Control
вводит в заблуждение;Контроллер имеет реальное значение в других контекстах.
Альтернативой может быть создание Dictionary<Type, Func<Control, string>>
, где запись будет выглядеть как {typeof(Textbox), c=>((TextBox)c).Text}
, но я думаю, что это будет намного менее понятно, чем просто использование переключателя, такого какЯ показал.
Еще одна вещь: Вы можете сделать эту функцию методом расширения для типа Control
(поместив его в статический класс ипоместив ключевое слово this
перед Control
в списке параметров).Я бы, наверное, переименовал его GetTextValue
.В этот момент вы можете просто сказать var textValue = anyControl.GetTextValue();
для любого элемента управления на своей странице.К сожалению, в C #
пока нет
extension property