2

リフレクションを使用してモデル プロパティをループし、プロパティを en 式として期待するメソッドに渡したいと考えています。

たとえば、次のモデルがあるとします。

public class UserModel
{
    public string Name { get; set; }
}

そして、このバリデータークラス:

public class UserValidator : ValidatorBase<UserModel>
{
    public UserValidator()
    {
        this.RuleFor(m => m.Username);
    }
}

そして私の ValidatorBase クラス:

public class ValidatorBase<T>
{
    public ValidatorBase()
    {
        foreach (PropertyInfo property in 
                     this.GetType().BaseType
                         .GetGenericArguments()[0]
                         .GetProperties(BindingFlags.Public | BindingFlags.Insance))
        {
            this.RuleFor(m => property); //This line is incorrect!!
        }
    }

    public void RuleFor<TProperty>(Expression<Func<T, TProperty>> expression)
    {
        //Do some stuff here
    }
}

問題はValidatorBase()コンストラクターにあります-必要なプロパティがある場合、コンストラクターの行と同じように機能するように、メソッドのパラメーターPropertyInfoとして何を渡す必要がありますか?expressionRuleForUserValidator()

または、これを機能させるために他の何かを使用する必要がありPropertyInfoますか?

4

1 に答える 1

5

私はあなたが欲しいと思う:

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

RuleFor基本的には、プロパティの式ツリーを構築することです... C# 4 の動的型付けは、リフレクションを介して明示的に行うことなく簡単に呼び出すことができるようにするために使用されます。もちろん、それを行うこともできRuleForますが、メソッドをフェッチしてからMethodInfo.MakeGenericMethod、プロパティ タイプで呼び出し、メソッドを呼び出す必要があります。

于 2012-09-06T20:06:02.317 に答える