Я использую FluentValidation для проверки своих элементов формы в Xamarin.Forms. Определение этих предметов происходит извне. Поэтому я не знаю, какие свойства мне нужно проверить на моей модели просмотра.Динамически генерировать выражения LINQ (member-)
RuleFor(viewmodel => viewmodel.Description).NotEmpty();
Моя идея состояла в том, чтобы динамически генерировать эти выражения во время выполнения.
Я создал в валидаторе для хранения этих выражений.
public List<Expression<Func<IViewModel, object>>> RequiredFieldExpressions
= new List<Expression<Func<IViewModel, object>>>();
Перед тем, как проверить мою модель просмотра, я генерирую выражения.
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();
Что мне не хватает?