Есть ли проблемы с этим использованием использования методов расширения для автоматического преобразования текста текстового поля для пользовательского интерфейса winforms - PullRequest
1 голос
/ 20 июля 2011

Я сделал следующее, потому что: а) Я заставляю себя использовать более новые функции языка C # (или те, которые я никогда раньше не использовал) б) Я устал набирать код преобразования каждый раз, когда текстовое поле содержит не строковое значение

Итак, я придумал:

public static class MyExt
{
    public static MyTextBox Auto(this TextBox tb)
    {
        return new MyTextBox(tb);
    }
}
public class MyTextBox
{
    private TextBox _textBox;
    public MyTextBox(TextBox t)
    {
        _textBox = t;
    }
    public static implicit operator string(MyTextBox o)
    {
        return o._textBox.Text;
    }
    public static implicit operator int(MyTextBox o)
    {
        return Convert.ToInt32(o._textBox.Text);
    }
}

Тогда, если мне нужно передать значение текстового поля куда-нибудь, для которого требуется int:

var a = new UnitCountsForm(campaign_NumberTextBox.Auto());

ВОПРОС: я вышел из глубины или это похоже на разумное использование методов расширения в сочетании с неявными операторами?

1 Ответ

1 голос
/ 20 июля 2011

Если вы решите пойти дальше, я бы посоветовал вам не использовать методы расширения.Как сказал кто-то еще, основное использование методов расширения - это когда у вас нет исходного кода.В вашем случае вы можете заменить метод расширения статическим фабричным методом внутри MyTextBox.Или просто исключите эту идею и напишите:

var mytb = new MyTextBox(tb);

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

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

public static implicit operator int(MyTextBox o)
{
    int val;
    if (int.TryParse(o_textBox.Text, out val))
    {
        return val;
    }
    return -1;
}

Но тогда вы не сможете определить разницу между пользователем, вводящим «-1», и пользователем, вводящим «xyzzy».

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

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

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