2017-01-17 6 views
2

FluentValidationを使用して、Xamarin.Formsのフォームアイテムを検証しています。これらの項目の定義は外部からのものです。したがって、私は自分のビューモデルで検証する必要があるプロパティはわかりません。動的にLINQ(メンバー)式を生成する

RuleFor(viewmodel => viewmodel.Description).NotEmpty(); 

私の考えは、実行時にこれらの式を動的に生成することでした。

これらの式を格納するためにバリデーターにListを作成しました。

public List<Expression<Func<IViewModel, object>>> RequiredFieldExpressions 
    = new List<Expression<Func<IViewModel, object>>>(); 

私のviewmodelを検証する前に、私は式を生成します。

var tmpMethod = typeof(TypeHelper).GetRuntimeMethod("GetExpression", new Type[] { typeof(string) }); 
var tmpGeneric = tmpMethod.MakeGenericMethod(myViewModel.GetType(), typeof(string)); 
var tmpInvokeResult = tmpGeneric.Invoke(null, new object[] {coreObjectPropertyName}); 

表現を作成する方法:

public static Expression<Func<T, TProperty>> GetExpression<T, TProperty>(string inPropertyName) where T : IViewModel 
{ 
    var tmpPropertyInfo = typeof(T).GetRuntimeProperties().First(p => p.Name == inPropertyName); 

    var tmpEntityParam = Expression.Parameter(typeof(T), "type"); 
    Expression tmpExpression = Expression.Property(tmpEntityParam, tmpPropertyInfo); 

    if (tmpPropertyInfo.PropertyType != typeof(TProperty)) 
    { 
     tmpExpression = Expression.Convert(tmpExpression, typeof(TProperty)); 
    } 
    return Expression.Lambda<Func<T, TProperty>>(tmpExpression, tmpEntityParam); 
} 

今すぐ検証ルールを作成する必要がありますラインが無効なキャスト例外がスローされます。

// Cast not valid 
RuleFor((Expression<Func<IViewModel, object>>) tmpInvokeResult).NotEmpty(); 

何が欠けていますか?私は

var tmpGeneric = tmpMethod.MakeGenericMethod(myViewModel.GetType(), typeof(string)); 

私の推測

var tmpGeneric = tmpMethod.MakeGenericMethod(myViewModel.GetType(), typeof(object)); 

Xamarin.Formsからメソッド呼び出しを変更する必要がありました

答えて

0

は、ポータブルクラスライブラリ(PCL)を使用しています。一般的な表現をキャストする機能は実装されていないようです。

誰かがこれを確認できるといいですね。

更新

私は、一般的な表現をキャストすることはできませんよ。それはちょうど不可能であるように思えます。式を返す前に明示的に変換する必要があります。

https://dotnetfiddle.net/ufNId4

関連する問題