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からメソッド呼び出しを変更する必要がありました