1

我再次需要你的帮助,这一次我在协变、逆变、委托和一个简单的想法爆炸中挣扎......

我想为我们的 businessobject-properties 实现一个属性,该属性接受一个委托和该委托所需的参数,以便我可以使用反射、读出属性并对属性值执行验证。

这背后的原因是,我们正在使用带有 DataBinding 的 Windows.Forms,并且需要将 DataBinding 更新方法设置为 OnPropertyChanged,以在 GUI 上获得正常工作的刷新。然而,我们确实需要一种在控件的验证事件中做出反应以正确验证属性的方法,以查看用户是否可以实际保存对象。但是控件的 Validating-Event 仅在将值写入属性后才会发生。在属性的设置器中进行验证会导致崩溃,并且我们无法向用户提供确切的信息,除非我们第二次实施验证(或将其提取到从设置器调用的方法中)。

为了保持这个最优雅和干净,我认为拥有以下之一会很不错:

[PropertyValidator(ValidationHelper.ValidateString, new StringValidatorArgs(true, 3, 15))]

这样我就可以通过反射对所有属性进行迭代,执行我们希望它们执行的所有验证,并使用正确的方法设置 PropertyValidator-Attribute。但是我对这个想法进行了一些尝试,但无论如何都没有让它发挥作用,这就是我所拥有的,可能你对如何实现这一点有一个想法。

public delegate bool Validator(object validatee, ValidatorArgs v);

public class ValidatorArgs
{
}

public class StringValidatorArgs : ValidatorArgs
{
    public StringValidatorArgs(bool nullCheck, int minLength, int maxLength)
    {
        this.NullCheck = nullCheck;
        this.MinLength = minLength;
        this.MaxLength = maxLength;
    }

    public bool NullCheck { get; set; }
    public int MinLength { get; set; }
    public int MaxLength { get; set; }
}

public class MyClass
{
    [PropertyValidator(ValidationHelper.ValidateString, new StringValidatorArgs(true, 3, 15))]
    public string MyString { get; set; }
}

public static class ValidationHelper
{
    public static bool ValidateString(object validatee, StringValidatorArgs v)
    {
        return true;
    }
}

[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = true)]
public class PropertyValidatorAttribute
    : Attribute
{
    #region Constructor

    private PropertyValidatorAttribute()
    {
    }

    public PropertyValidatorAttribute(Validator validator, ValidatorArgs args)
    {
        this.Validator = validator;
        this.Args = args;
    }

    #endregion

    #region Properties

    public Validator Validator
    {
        get;
        private set;
    }

    public ValidatorArgs Args
    {
        get;
        private set;
    }

    #endregion
}

欢迎任何提示...

4

1 回答 1

2

如何实现 IDataErrorInfo 以从您的对象提供验证信息,而不是(我假设)从错误数据的 setter 中抛出异常?大多数 Windows 窗体控件都精通 IDataErrorInfo,并将基于每个属性或每个对象提供相应的 UI 验证信息。

于 2010-02-25T18:23:18.587 回答