在做 wpf 数据验证的时候,我参考了这篇文章后面分离的那种写法:MVVM模式下的输入校验
既然我也是新手就不能说直接用别人的代码是不好的,反正我也是“借鉴”而已
一直都感觉用着不错,挺爽。
直到有一天,我突然发现,如果一个属性的验证需要根据其他属性的选择来进行不同的处理,直接傻眼了。
MSDN上找文档,找到了个这:
当 IsValid调用方法执行验证时,CustomValidationAttribute 属性用于执行自定义验证。然后,它将调用重定向到由 Method 属性标识的IsValid方法,该方法又执行实际验证。
CustomValidationAttribute 特性可以应用于类型、属性、字段、方法和方法参数。在将特性应用于某个属性时,无论是否为该属性分配值,都会调用特性。在将特性应用于某个方法时,无论程序是否调用该方法,都会调用特性。在将特性应用于方法参数时,会先调用特性,然后再调用方法。
这有什么卵用啊
然后谷歌,没啥结果。百度就更不用说了
然后被人说不好好做项目搞这个浪费时间就不知道先做基础的东西?好吧做基础的东西。
半个多月过去了,回过头来搞验证,各种奇怪的方法都试过了,但由于以下原因统统失败:
public static string ValidateProperty<MetadataType>(this object obj, string PropertyName)
{
//...................
var targetType = obj.GetType();
var provider = new AssociatedMetadataTypeTypeDescriptionProvider(targetType, typeof(MetadataType));
//..............
TypeDescriptor.AddProvider(provider, targetType);
//...............
Validator.TryValidateProperty(propertyValue, validationContext, validationResults);
//................
TypeDescriptor.RemoveProvider(provider, targetType);
//................
就是这里,真是不知道 Validator 干甚了,验证完死活移除不掉 Provider,下次过来新的MetadataType再添加也是死活添加不了,真心给跪了。
然而问题在我有了【不寻常】想法的时候解决了:我复制下来 CustomValidationAttribute 的源代码自己浏览、调试,于是这个该死的方法就这样被我找到了。
private string ValidateMethodParameter()
{
//...................
ParameterInfo[] parameterInfos = methodInfo.GetParameters();
//...................
// We accept 2 forms:
// 1-parameter form is ValidationResult Method(object value)
// 2-parameter form is ValidationResult Method(object value, ValidationContext context),
this._isSingleArgumentMethod = (parameterInfos.Length == 1);
//..................
真的是醉了,为什么要写在这样一个鸟不拉屎的地方!?写到文档里不就得了