验证数据输入的合法性

发布时间 2023-12-11 17:17:51作者: wzwyc

我们软件开发过程中,很多时候都需要用户进行数据录入。
录入以后,我们需要对数据的合法性进行判断,每一个需要判断的字段都需要一个判断条件,冗余代码较多。一直觉得这块比较繁琐,特别是需要输入和验证的字段比较多的时候。
一直想对这块进行优化。今天进行了一些简单的尝试。

代码:

using System;
using System.Text;

namespace CgdataBase;

public static class InputHelper
{
    public static bool InputValueIsValid<T>(string text, string keyName, Func<T, bool> func, StringBuilder builder)
    {
        try
        {
            if (text.IsNullOrEmpty())
            {
                builder?.AppendLine($"请输入 {keyName}");
                return false;
            }

            var value = (T)Convert.ChangeType(text, typeof(T));
            if (func != null)
            {
                var result = func.Invoke(value);
                if (result == false)
                {
                    builder?.AppendLine($"请输入正确的 {keyName}");
                }

                return result;
            }

            return true;
        }
        catch (Exception)
        {
            builder?.AppendLine($"请输入正确的 {keyName}");
        }

        return false;
    }
}

使用示例:

private void OnSubmit()
{
    bool result = true;
    StringBuilder sb = new StringBuilder();
    result &= InputHelper.InputValueIsValid<string>(TemplateName, "模板名称", s => s.IsContainValidText(), sb);
    result &= InputHelper.InputValueIsValid<string>(FileName, "文件名", s => s.IsContainValidText(), sb);
    result &= InputHelper.InputValueIsValid<int>(KeyCount, "个数", s => s >= 0, sb);

    if (result == false)
    {
        MessageBox.Show(sb.ToString());
        return;
    }

    if (Result == null)
        Result = new TemplateInfo();

    ObjectHelper.DeepCopy(this, Result, false);
    Result.TemplateContent = GetTemplateContent();

    App.GetActiveWindow().DialogResult = true;
}

这样的话,在界面的ViewModel部分,所有字段对应的数据类型都可以定成string,提交时根据目标类型进行转换和判断。
我这里面使用的ObjectHelper.DeepCopy(this, Result, false)方法也里面封装了,直接由string类型转换成目标类型的转换操作。