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>();
}
}
Дженерики работают над типами, а не самими членами. Я вижу, что вы получаете, но дженерики - это не способ сделать это, просто нет способа генерировать древовидные рожки в то, к чему вы стремитесь. –
Как определяется 'RuleFor'? Что такое 'obj' в' ruleForEmail/Test'? Существует много вопросов о вашем коде ... Я думаю, вы хотите, чтобы ваш 'ruleForText' был объявлен как принимающий' Func ' и передал ему '() => Name'. – MarcinJuraszek
Почему вы не можете передать только значение свойства, чтобы его проверить? 'RuleFor (строка valueToValidate, строка msg);' – Fabio