1

DI は 2 つのカスタム検証属性を作成しました。日付の検証を行った後、時間の検証を行いたいのですが、そのためには MyDate が必要です。時間検証内から MyDate にアクセスするにはどうすればよいですか?

私のモデル:

[DateValidation()]
public DateTime MyDate { get; set;}

[TimeValidation()]
public TimeSpan MyTime { get; set;}

私のタイムバリデーション:

public class TimeValidation: ValidationAttribute
{
    public override bool IsValid(object value)
    {
        TimeSpan time = (TimeSpan)value;
        DateTime MyDate //How can I get this?
        // Do stuff
        // return something good
    }       
}
4

1 に答える 1

1

MSDNを確認すると、IsValidメソッドについて次のように表示されます。

オブジェクトの指定された値が有効かどうかを判断します。

そして、そのvalueパラメータについて次のIsValidように述べています。

value 型: System.Object 検証するオブジェクトの値。

したがって、いわゆる日付は であり、valueそれを にダウンキャストするだけですDateTime:

DateTime MyTime = (DateTime)value;

アップデート

それは本当に私が探していたものではありません。値を使用して検証を行う方法を知っています。しかし、私があなたに与えた漠然とした例では、値は MyTime です。しかし、MyTime の検証内に MyDate も必要です。(動作しているため、MyDate の検証を意図的に省略しました)

そんなことはできません。結局のところ、属性を実装していて、属性はタイプのメタデータの詳細です。つまり、適用対象のオブジェクトを認識できません。

必要なのはIsValid(object, ValidationContext)オーバーロードであり、ValidationContext検証するオブジェクトをObjectInstanceプロパティとして提供します。

したがって、リフレクションを使用して他のプロパティにアクセスできます。

DateTime MyDate = (DateTime)validationContext.ObjectInstance.GetType()
                    .GetProperty("MyDate", BindingFlags.Public | BindingFlags.Instance)
                    .GetValue(validationContext.ObjectInstance);

また、関連するプロパティ名をハードコーディングしないために、TimeValidation呼び出された属性に引数を追加します。relatedPropertyName

于 2015-07-01T09:31:22.820 に答える