C# 如果属性是在接口上定义的,那么xVal会工作吗?

C# 如果属性是在接口上定义的,那么xVal会工作吗?,c#,.net,asp.net-mvc,validation,xval,C#,.net,Asp.net Mvc,Validation,Xval,我想知道如果我在由模型类实现的接口上定义system.componentmodel.dataannotations属性,而不是直接在具体的模型类上,是否有人知道xVal是否会像预期的那样工作 public interface IFoo { [Required] [StringLength(30)] string Name { get; set; } } 然后在我的模型类中没有任何验证属性 public class FooFoo : IFoo { public strin

我想知道如果我在由模型类实现的接口上定义system.componentmodel.dataannotations属性,而不是直接在具体的模型类上,是否有人知道xVal是否会像预期的那样工作

public interface IFoo
{
    [Required] [StringLength(30)]
    string Name { get; set; }
}
然后在我的模型类中没有任何验证属性

public class FooFoo : IFoo
{
    public string Name { get; set; }
}

如果我尝试用xVal验证Foooo,它会从接口使用属性吗?

此时,
xVal.RuleProviders.DataAnnotationsRuleProvider
只查看在模型类本身上定义的属性。您可以在规则提供程序基类
propertyattributeproviderbase
中的方法
GetRulesFromProperty
中看到这一点:

protected virtual IEnumerable<Rule> GetRulesFromProperty(
    PropertyDescriptor propertyDescriptor)
{
    return from att in propertyDescriptor.Attributes.OfType<TAttribute>()
           from validationRule in MakeValidationRulesFromAttribute(att)
           where validationRule != null
           select validationRule;
}

要从已实现接口中的属性获取属性,您应该扩展
DataAnnotationsRuleProvider
并覆盖
GetRulesFromTypeCore
。它获取的参数类型具有方法。

感谢您提供的详细答案!!我想下一个问题是:有没有一种简单的方法来迭代类实现的接口?您需要这样做才能为接口上的每个属性获取PropertyDescriptor。我添加了一些关于如何获取类型的已实现接口的更多信息。看起来非常简单,非常感谢!!
ActiveRuleProviders.Providers.Clear();
ActiveRuleProviders.Providers.Add(new MyDataAnnotationsRuleProvider());
ActiveRuleProviders.Providers.Add(new CustomRulesProvider());