Мне снова нужна ваша помощь, на этот раз я борюсь с ковариацией, контравариантностью, делегатами и взрывом простой идеи ...
Я хочу реализовать атрибут для наших свойств 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
}
Любые советы приветствуются ...