我们软件开发过程中,很多时候都需要用户进行数据录入。
录入以后,我们需要对数据的合法性进行判断,每一个需要判断的字段都需要一个判断条件,冗余代码较多。一直觉得这块比较繁琐,特别是需要输入和验证的字段比较多的时候。
之前尝试用过FluentValidation和Validation,貌似都跟期望的有点差距。
一直想对这块进行优化。今天进行了一些简单的尝试。
代码:
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类型转换成目标类型的转换操作。