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我需要的属性,我应该将什么作为方法中的expression参数传递给RuleFor它,这样它就可以像UserValidator()构造函数中的行一样工作?

或者,我应该使用其他东西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);

基本上,这是为属性构建表达式树的问题......来自 C# 4 的动态类型仅用于使其更容易调用RuleFor,而无需通过反射显式执行此操作。当然,您可以这样做 - 但您需要获取RuleFor方法,然后MethodInfo.MakeGenericMethod使用属性类型调用,然后调用方法。

于 2012-09-06T20:06:02.317 回答