Ковариантность, контравариантность и проблема делегата - PullRequest
1 голос
/ 25 февраля 2010

Мне снова нужна ваша помощь, на этот раз я борюсь с ковариацией, контравариантностью, делегатами и взрывом простой идеи ...

Я хочу реализовать атрибут для наших свойств businessobject, который принимает делегата и необходимые параметры для него, чтобы я мог работать с отражением, считывать атрибут и выполнять проверку значения свойства.

Причина этого в том, что мы используем Windows.Forms с DataBinding и должны установить метод обновления DataBinding на OnPropertyChanged, чтобы получить правильно работающее обновление в графическом интерфейсе. Однако нам нужен способ реагирования на события проверки элементов управления для правильной проверки свойства, чтобы увидеть, может ли пользователь на самом деле, например, сохранить объект. Но 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
}

Любые советы приветствуются ...

1 Ответ

2 голосов
/ 25 февраля 2010

А как насчет реализации IDataErrorInfo для предоставления информации о проверке вашего объекта, вместо (я предполагаю) выдачи исключения из установщика для неверных данных?Большинство элементов управления Windows Forms являются подкованными IDataErrorInfo и предоставляют соответствующую информацию для проверки пользовательского интерфейса для каждого свойства или объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...