协方差,逆差和代表问题

时间:2010-02-25 14:17:26

标签: c# attributes delegates covariance contravariance

我再次需要你的帮助,这次我为协方差,反作用,代表和一个简单的想法而奋斗......

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

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

为了保持这个最优雅和干净,我认为以下其中一个会很高兴:

[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
}

任何提示都欢迎......

1 个答案:

答案 0 :(得分:2)

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