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最も簡単な解決策は、次を受け入れるように変更すること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 に答える