3

ラムダ式を作成して、これを rulefor に渡そうとしています。コードはコンパイルされますが、実行すると次のメッセージが表示されます..

「'FluentValidation.Internal.RuleBuilder' には 'Length' の定義が含まれていません」

これが検証コードです。目的は、2 つのバリデーターで、同じ検証ルールを再度ユーザー名または別のプロパティに適用することです。

public class UserValidator : AbstractValidator<DTO.User>
{
    public UserValidator(DTO.User u)
    {

        foreach (PropertyInfo property in
                 this.GetType().BaseType
                     .GetGenericArguments()[0]
                     .GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {


            if (property.Name == "Username")
            {

                ParameterExpression parameter = Expression.Parameter(typeof(DTO.User), "p");
                Expression propertyAccess = Expression.Property(parameter, property);
                // Make it easier to call RuleFor without knowing TProperty
                dynamic lambda = Expression.Lambda(propertyAccess, parameter);

                RuleFor(lambda)
                    .Length(4, 9)
                    .WithMessage("Valid between 4 and 9 chars");

                //RuleFor(x => x.Username)
                //    .Length(4, 9)
                //    .WithMessage("Valid between 4 and 9 chars");
            }

        }
    }

助けていただければ幸いです...

4

1 に答える 1

3

これがあなたが望んでいるような助けかどうかはわかりませんが、あなたが提案しているのは流暢なフレームワークの型破りな使用法です. コメントアウトされたコードは、このフレームワークを使用する通常の方法です。UserValidatorこれにより、マジック ストリングやリフレクションを使用せずに、クローズド ジェネリック バリデータ クラス ( ) 内で強力な型付けが可能になります。

つまり、長さをアサートするコードの繰り返しを本当に避けたい場合は、式を引数として取るヘルパーを使用してそれを行うことができます。

public class User
{
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        this.ValidateName(x => x.Username);
        this.ValidateName(x => x.FirstName);
        this.ValidateName(x => x.LastName);
    }
}

public static class ValidationExtensions
{
    public static void ValidateName<TV>(this AbstractValidator<TV> validator, Expression<Func<TV, string>> property)
    {
        validator.RuleFor(property).Length(4, 9).WithMessage("Valid between 4 and 9 chars");
    }
}
于 2012-12-20T08:21:25.020 に答える