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 を実装して、オブジェクトから検証情報を提供するのはどうでしょうか? (私は推測していますが) 悪いデータに対してセッターから例外をスローするのではありませんか? ほとんどの Windows フォーム コントロールは IDataErrorInfo に精通しており、プロパティごとまたはオブジェクトごとに対応する UI 検証情報を提供します。

于 2010-02-25T18:23:18.587 に答える