2015-07-17 3 views
0

Я пытаюсь реализовать базовый класс для FluentValidation, который быстро построит валидатор для классов. Мои базовые функции класса пытаются использовать свойство класса в качестве аргумента Generic type для применения правил. Но, как вы увидите в коде, это не совсем синтаксически (между прочим) правильно.Свойство Pass Class как общий тип

Это, вероятно, гораздо проще объяснить в коде:

public class BaseValidator<T> : AbstractValidator<T> 
{ 
    public void ruleForText<U>(string msg) 
    { 
     RuleFor(obj => obj.U).NotEmpty().WithMessage(msg); 
     RuleFor(obj => obj.U).Length(1, 100).WithMessage(msg); 
     RuleFor(obj => obj.U).Matches("[A-Z]*").WithMessage(msg); 
    } 

    public void ruleForEmail<U>(string msg) 
    { 
     RuleFor(obj => obj.U).NotEmpty().WithMessage(msg); 
     RuleFor(obj => obj.U).EmailAddress().WithMessage(msg); 
    } 
} 

public class Member { 
    public string Name { get; set; } 
    public string Email { get; set; } 
} 

public class Post{ 
    public string Title { get; set; } 
} 

public class MemberValidator :BaseValidator<Member> 
{ 
    public MemberValidator() 
    { 
     // Not valid syntax to pass name or even Member.Name 
     // How can I pass Member.Name as the generic type? 
     ruleForText<Name>(); 
     ruleForEmail<Email>(); 
    } 
} 

public class PostValidator :BaseValidator<Post> 
{ 
    public MemberValidator() 
    { 
     ruleForText<Title>(); 
    } 
} 
+0

Дженерики работают над типами, а не самими членами. Я вижу, что вы получаете, но дженерики - это не способ сделать это, просто нет способа генерировать древовидные рожки в то, к чему вы стремитесь. –

+0

Как определяется 'RuleFor'? Что такое 'obj' в' ruleForEmail/Test'? Существует много вопросов о вашем коде ... Я думаю, вы хотите, чтобы ваш 'ruleForText' был объявлен как принимающий' Func ' и передал ему '() => Name'. – MarcinJuraszek

+0

Почему вы не можете передать только значение свойства, чтобы его проверить? 'RuleFor (строка valueToValidate, строка msg);' – Fabio

ответ

1

Это может быть то, что вы ищете. Вам нужно передать выражение с параметром функции, являющимся строкой.

public class BaseValidator<T> : AbstractValidator<T> 
{ 
    public void RuleForText(Expression<Func<T, string>> expression, string msg) 
    { 
     RuleFor(expression).NotEmpty().WithMessage(msg); 
     RuleFor(expression).Length(1, 100).WithMessage(msg); 
     RuleFor(expression).Matches("[A-Z]*").WithMessage(msg); 
    } 

    public void RuleForEmail(Expression<Func<T, string>> expression, string msg) 
    { 
     RuleFor(expression).NotEmpty().WithMessage(msg); 
     RuleFor(expression).EmailAddress().WithMessage(msg); 
    } 
} 

public class MemberValidator : BaseValidator<Member> 
{ 
    public MemberValidator() 
    { 
     RuleForText(member => member.Name, "My Message"); 
     RuleForEmail(member => member.Email, "My Message"); 
    } 
} 

public class Member 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^