2

我正在使用 simplemvvmtoolkit 进行验证(INotifyDataErrorInfo)。我不想为视图模型中的每个属性一遍又一遍地重复我自己,我喜欢使用反射来获取所有属性并验证它们,但我似乎无法弄清楚在 validateProperty 方法中传递什么。

    private void ValidateInput()
    {
        var unitProperties = this.GetType().GetProperties()
                                   .Where(x => x.CanRead);

        foreach (var prop in unitProperties)
            ValidateProperty(prop, prop.GetValue(this, null)); //????
                   //? ^ get errors here 


    }

ValidateProperty 接受:

    protected virtual void ValidateProperty<TResult>(Expression<Func<TViewModel, TResult>> property, object value);
4

1 回答 1

2

问题是与(返回的类型)Expression<Func<TViewModel, TResult>>完全没有关系。您还会遇到问题,因为结果的类型在编译时是未知的。PropertyInfoGetProperties

最简单的解决方案是更改ValidateProperty为接受 a PropertyInfo

protected virtual void ValidateProperty(PropertyInfo property, object value);

您也可以将 转换PropertyInfoExpression,但这有点困难:

var method = this.GetType().GetMethod("ValidateProperty");
foreach (var prop in unitProperties)
{
    var parameter = Expression.Parameter(this.GetType(), "_");
    var property = Expression.Property(parameter, prop);
    var lambda = Expression.Lambda(property, parameter);
    var genericMethod = method.MakeGenericMethod(prop.PropertyType);
    genericMethod.Invoke(this, new object[] { lambda, prop.GetValue(this, null) });
}
于 2013-04-24T17:04:39.870 回答