Как я могу передать делегатов в функцию для общих делегатов? - PullRequest
0 голосов
/ 24 января 2019

У меня есть функция для возврата соответствующего текста из различных элементов управления Windows.
Я надеялся создать что-то более элегантное и менее статичное. Вот код, который работает так, как я хочу:

    public string returnText(Control controller)
    {
        string bob = controller.GetType().Name.ToString();
        if (bob == "TextBox")
            return ((TextBox)controller).Text;
        else if (bob == "ComboBox")
            return ((ComboBox)controller).SelectedValue.ToString();
        else
            return "Invalid Object";
    }

Я хотел бы сделать что-то вроде этого:

Телефонный код:

        TextBoxValue del = x => x.Text;
        ComboBoxValue com = x => x.SelectedValue.ToString();
        bob.returnText2(this.cboUnitType, com);
        bob.returnText2(this.txtCurbAdj, del);

Функция:

    public string returnText2<T>(T controller, Func<T, string> lambda )
    {
        return lambda(controller);
    }

Полагаю, я неправильно делаю общую сторону вещей, но я не смог найти правильный способ сделать это. Или, может быть, я здесь полностью обедаю.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вот более чистая (и более четкая) версия вашего исходного кода.Он не использует никаких отражений, обобщений или вызовов 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
0 голосов
/ 24 января 2019

Использовать отражение довольно просто. Что вы делаете, это используете тип класса, чтобы получить их свойства. Затем вы запрашиваете значение этого свойства для объекта и получаете значение.

здесь быстрое простое отражение. Он получает тип объекта, запрашивает свойство с именем SelectedValue, затем запрашивает объект combobox, чтобы получить значение и, наконец, преобразовать его в строку.

var combobox = this.cboUnitType;
var value = combobox.GetType().GetProperty("SelectedValue").GetValue(combobox ).ToString();

Здесь то же самое, что сделано в функции, и довольно общий плюс имеет возможную обработку ошибок

private string GetValue(object obj, string property)
{
    var value = "";

    try
    {
        value = obj.GetType().GetProperty(property).GetValue(obj).ToString();
    }
    catch { }

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