2009-08-14 3 views
3

具体的なモデルクラスに直接ではなく、モデルクラスで実装されているインターフェイスでsystem.componentmodel.dataannotations属性を定義すると、xValが期待どおりに動作するかどうかを知っている人がいますか?属性がインタフェースで定義されている場合、xValは機能しますか?

public interface IFoo 
{ 
    [Required] [StringLength(30)] 
    string Name { get; set; } 
} 

、その後、私のモデルクラス内の任意の検証属性は存在しないだろう...

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

私はXVALとFooFooを検証しようとした場合、それはそのインターフェイスからはattribsを使うのでしょうか?

答えて

4

現時点では、xVal.RuleProviders.DataAnnotationsRuleProviderは、モデルクラス自体で定義されたプロパティのみを参照します。あなたはルールプロバイダベースクラスPropertyAttributeRuleProviderBase方法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; 
} 

propertyDescriptorパラメータはモデルクラス内のプロパティを表し、そのAttributesプロパティは、プロパティ自体に直接定義された属性のみを表しています。

もちろん、DataAnnotationsRuleProviderを拡張し、適切なメソッドをオーバーライドして、必要な処理を行うことができます。実装されたインターフェイスから検証属性を抽出します。 XVALを使用して、ルールのプロバイダを登録それから:

ActiveRuleProviders.Providers.Clear(); 
ActiveRuleProviders.Providers.Add(new MyDataAnnotationsRuleProvider()); 
ActiveRuleProviders.Providers.Add(new CustomRulesProvider()); 

実装されたインタフェースのプロパティから属性を取得するには、DataAnnotationsRuleProviderを拡張し、GetRulesFromTypeCoreをオーバーライドする必要があります。メソッドGetInterfacesを持つタイプSystem.Typeのパラメータを取得します。

+0

詳細な回答ありがとうございました!私は次の質問があると思います:クラスが実装するインターフェイスを反復する簡単な方法はありますか?インターフェイスの各プロパティのPropertyDescriptorsを取得するには、これを行う必要があります。 – NathanD

+0

タイプの実装されたインターフェイスを取得する方法に関する情報を追加しました。 –

+0

かなり簡単ですね、ありがとう! – NathanD

関連する問題