Подтвердить что ты не робот

Динамический фрагмент кода С# visual studio

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

Я хочу динамически создавать фрагмент кода в соответствии с именами элементов управления и некоторым условием.

Я хочу добавить код, когда часть дизайна будет выполнена. Я определяю имена элементов управления как intTextboxAge. Фрагмент должен добавить автоматическую проверку для всех текстовых полей, используя приведенную ниже fuction.

Должны быть разные элементы управления, основанные на префиксе имени управления (int, str, dou, dec). Например:

public void AutoCode()
{
    int i=0;
    foreach(On all controls)
    { 
        if(controls is textbox or combobox)
        {
            if(control.text starts with int)
            {
                a[i] = Validation.ValidateInt(labelError, control.text, val => acdnt.date = val);
            }
        }
    }
}

Я хочу создать сгенерированный фрагмент кода, библиотеки не смогут мне помочь.

Моим мотивом не генерировать код для проверки только приведенным выше примером является то, как мы можем это сделать.

Я хочу автоматически генерировать свой код всей бизнес-логики для основных форм выигрыша, например

  • Проверка
  • Создание нового класса для переменных
  • Заполнение данных в классе после проверки
  • Автоматическое создание функции вставки и обновления базы данных

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

Автоматическое создание класса -. Класс будет создан с именем формы + "Класс", а типы переменных будут идентифицированы с помощью первых 3 char и будут называться такими же, как имя элемента управления.

Автоматическое создание функции вставки и обновления базы данных. Назовите имя таблицы базы данных так же, как имя формы и имя столбца, такие же как имя элемента управления, чтобы оно также могло динамически создавать запросы на вставку и обновление.

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

С этим мы сможем сэкономить много времени и усилий в мире кодирования.

4b9b3361

Ответ 1

Я хочу добавить код, когда часть дизайна будет выполнена. Я определяю имена элементов управления, такие как intTextboxAge. Фрагмент должен добавить автоматическую проверку для всех текстовых полей, используя функцию, определенную ниже.

Было бы лучше иметь CustomControls со своей собственной проверкой, так что вам не нужно добавлять код после выполнения части дизайна:

enter image description here

//Integer input CustomControl with validation label (pictured above)
public partial class intTextBox : UserControl
{
    public bool IsValid {get;set;}
    public intTextBox()
    {
        InitializeComponent();
        this.textBox1.TextChanged += this.intTextBox_TextChanged;
    }

    private void intTextBox_TextChanged(object sender, EventArgs e)
    {
        int n;
        IsValid = int.TryParse(this.textBox1.Text, out n);
        label1.Visible = !IsValid;
    }
}

Должны быть разные элементы управления, основанные на префиксе имени управления (int, str, dou, dec)

Хотя вы можете использовать префикс имени управления, я рекомендую создать собственный UserControls, выведя базовые элементы управления и просто проверив тип управления:

//Decimal input UserControl
public class decTextBox : TextBox
{
    public string Text
    {
        get {
            return this.Text;
        }
    }

    public bool IsValid()
    {
        decimal n;
        bool isDecimal = decimal.TryParse(this.Text, out n);
        return isDecimal;
    }
}

....

public Control AutoCode(Control forEgTheForm)
{
    //Tip: You may need to recursively call this function to check children controls are valid
    foreach(var ctrl in forEgTheForm.Controls) { 
        if(ctrl is TextBoxBase) {
             if(ctrl is decTextBox) {
                 decTextBox txt = ((decTextBox)ctrl);
                 //If its not a valid value then set a[i]=true/false or in this example return the control...
                 if (!txt.IsValid()) return ctrl;
             }
        }
    }
}

Я хочу динамически создавать фрагмент кода в соответствии с именами элементов управления и некоторым условием.

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

...


Было бы еще более элегантно не писать никаких фрагментов или кода проверки. Это идеальное решение. Я рекомендую сделать это, используя правильный тип элементов управления.

Текстовые поля хороши для строки, однако для int, dec и dbl вам лучше использовать элемент управления NumericUpDown. Таким образом, пользователи будут интуитивно знать, что им нужно вводить числа (и не смогут вводить буквенно-цифровые символы). После установки пары свойств управления NumericUpDown (во время разработки или времени выполнения) вам не нужно вводить код в валидацию:

enter image description here


Я не уверен в причине ухудшения производительности, с которой вы сталкиваетесь? Хотя я предлагаю вам связать элементы управления с классом в библиотеке классов со всей бизнес-логикой, чтобы вы могли Unit Test. Для проверки подлинности на лицевой стороне, хотя правильная проверка входных данных правильна, как показано выше, это путь.

Ответ 2

Вы можете попробовать генераторы кода на основе таких скриптов, как CodeSmith (также есть что-то бесплатно).
Вы можете написать свой script на основе определенных вами переменных (также на основе элементов базы данных), а затем сгенерировать код.
Создание кода - хороший подход, поскольку экономит время, но также стандартизирует код.

Ответ 3

Я думаю, вы можете использовать пространство имен System.Reflection в сочетании с System.CodeDom, чтобы достичь желаемого.

Вы можете использовать классы в пространстве имен System.Reflection и классе System.Type, чтобы узнать имя сборки, пространство имен, свойства, методы, базовый класс и множество других метаданных о классе или переменной. Затем вы будете использовать эти метаданные, полученные из ваших исходных/исходных классов (например, ваши классы форм), чтобы сгенерировать код ваших целевых классов (ваш бизнес и классы данных) с помощью CodeDOM.

Проверьте эту ссылку msdn на Как создать класс с использованием CodeDOM в качестве отправной точки.