2017-01-17 4 views
2

Я использую 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(); 

Что мне не хватает?

ответ

0

я должен был изменить вызов метода из

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

в

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

Моей догадки

Xamarin.Forms использует портативные библиотеки классов (PCL). Похоже, что функция генерации генерических выражений не реализована.

Было бы хорошо, если бы кто-нибудь мог это проверить.

Update

Я не в состоянии бросить общие выражения. Похоже, это просто невозможно. Вам нужно явно преобразовать выражение перед его возвратом.

https://dotnetfiddle.net/ufNId4

Смежные вопросы