最近的一点心得

在做 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);
    //..................

真的是醉了,为什么要写在这样一个鸟不拉屎的地方!?写到文档里不就得了抓狂


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值