在自定义验证属性中获取值?

Get value inside custom validation attribute?

DI 创建了两个自定义验证属性。完成日期验证后,我想进行时间验证,但为此我需要 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
    }       
}

如果您检查 MSDN,它表示 IsValid 方法:

Determines whether the specified value of the object is valid.

而且,关于 IsValidvalue 参数,它说:

value Type: System.Object The value of the object to validate.

因此,您所谓的日期是 value,您只需将其向下转换为 DateTime:

DateTime MyTime = (DateTime)value;

更新

Thats not really what I was looking for. I know how to do the validation with value. But in the vague example I gave you value is MyTime. But I also need MyDate inside the validation of MyTime. (I intentionally left out the validation of MyDate since it is working)

你不能那样做。归根结底,您正在实现一个属性,而属性是一种类型元数据详细信息。换句话说:他们不知道他们所应用的对象。

你需要的是 IsValid(object, ValidationContext) 重载,ValidationContext 会给你要验证的对象 ObjectInstance 属性.

因此,您可以使用反射访问另一个 属性:

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

我还要向 TimeValidation 属性添加一个名为 relatedPropertyName 的参数,以免对相关的 属性 名称进行硬编码。