2016-11-04 55 views
1

給定一個基類,該基類有一個通用參數,用於定義屬性的類型,並且對另一個基類型有限制,當爲派生類編寫Fluent Validator時,該驗證程序如何切換應用哪個子驗證程序到通用屬性?如何根據屬性的運行時類型動態選擇驗證器?

下面是一些示例類來證明這一點的配置:

public abstract class BaseParent<TChildType> where TChildType : BaseChild 
{ 
    public TChildType Child {get; set;} 
} 

public abtract class BaseChild 
{ 
    public sting ChildPropOne {get; set;} 
} 

public class ChildA : BaseChild 
{ 
    public string ChildAPropOne {get; set;} 
} 

public class ChildB: BaseChild 
{ 
    public string ChildBPropOne {get; set;} 
} 

public class ParentA<TChildType> : BaseParent<TChildType> where TChildType : BaseChild 
{ 
    public string ParentAPropOne {get; set;} 
} 

public class ParentB<TChildType> : BaseParent<TChildType> where TChildType : BaseChild 
{ 
    public string ParentBPropOne {get; set;} 
} 

我的當前設置強制每個父類型+子類型的組合不同的驗證器類。理想情況下,我可以寫每個家長一個校驗,每名兒童之一,並具有能夠選擇調用

+0

如果您使用DI容器來解析驗證器 - 您可以使用注入的實例將子驗證器注入父驗證器和「SetValidator」。 –

+0

謝謝阿列克謝,這基本上是我最終結束了,雖然使用手動DI。如果你願意的話,可以把它作爲一個答案。 – Phaeze

回答

2

你可以注入孩子的校驗器實例爲母公司的驗證和使用SetValidatorChild財產子驗證父驗證:

public class ParentAValidator<TChildType> : AbstractValidator<ParentA<TChildType>> where TChildType : BaseChild 
{ 
    public ParentAValidator(IValidator<TChildType> childValidator) 
    { 
     RuleFor(p => p.Child).SetValidator(childValidator); 
    } 
}