2013-04-24 144 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

相關問題