2013-04-24 107 views
2

通过每个属性我正在使用simplemvvmtoolkit进行验证(INotifyDataErrorInfo)。而不是我重复自己一遍又一遍的视图模型中的每个属性,Id喜欢使用反射来获取所有属性并验证它们,但我似乎无法弄清楚在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); 
+0

如果”已经实现了INotifyDataErrorInfo,你不能只为每个属性名称调用GetErrors(name)方法吗? – RogerN 2013-04-24 18:09:55

回答

2

问题是Expression<Func<TViewModel, TResult>>完全没有关系PropertyInfo(由GetProperties返回的类型)。你也会遇到问题,因为结果的类型在编译时是不知道的。

最简单的办法是改变ValidateProperty接受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) }); 
} 
+0

感谢您的回应,在PropertyInfo中更改ValidateProperty会需要实现方法更改,但方法正确吗?此方法是simpleMvvmToolkit的一部分。 – TMan 2013-04-24 17:44:29

+0

@TMan它肯定需要修改方法。变化的剧烈程度取决于现在如何实施以及其他可用的设施。大多数情况下,asp.net MVC中的表达式参数只是作为一种将PropertyInfo传递给方法的更令人愉快的语法(和类型安全的)方式,所以我怀疑可能已经有一种方法可以满足您的需求一个PropertyInfo。 – 2013-04-24 18:04:17

相关问题