在我正在处理的 WPF 项目中,我正在考虑通过视图模型属性的属性来实现数据验证。
例子:
[RegexConstraint("^[A-Z][a-zA-Z]+$")]
public string Name
{
set
{
_name = value;
OnPropertyChanged("Name")
}
}
我所有的视图模型都继承自一个通用的 ViewModelBase 类,该类实现了 IDataErrorInfo。索引器:
string IDataErrorInfo.this[string columnName]
按名称检索属性(使用反射),
var properties = GetType().GetProperties().Where(p=> p.Name == "someName")
找到所有约束属性...
private static ICollection<IValidator> GetValidations(PropertyInfo property)
{
return (ValidationAttribute[])property.GetCustomAttributes(typeof(ValidationAttribute), true))
.Select(va => new AttributeValidator(va)).Cast<IValidator>().ToList();
}
...并执行验证
它似乎有效,但我的问题是 - 有没有人有使用类似技术的经验?这是个坏主意吗?
它确实使我的代码看起来更简洁,并且我避免了在所有视图模型类中实现 IDataErrorInfo,但另一方面它产生了一个新问题 - 当验证逻辑依赖于属性时,如何构造漂亮的用户消息名称/属性名称,而不是使用硬编码的消息 - 就像我能找到的所有 IDataErrorInfo 示例一样。
总结一下——我的问题是——我应该继续走这条路,还是应该使用不同的验证方案?