我正在使用 FluentValidation 来验证 Xamarin.Forms 中的表单项。这些项目的定义来自外部。因此我不知道,我需要在我的 View 模型上验证哪些属性。
RuleFor(viewmodel => viewmodel.Description).NotEmpty();
我的想法是,在运行时动态生成这些表达式。
我在验证器中创建了一个 List
来存储这些表达式。
public List<Expression<Func<IViewModel, object>>> RequiredFieldExpressions
= new List<Expression<Func<IViewModel, object>>>();
在验证我的 View 模型之前,我生成了表达式。
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 使用可移植类库 (PCL)。似乎没有实现转换泛型表达式的功能。
如果有人能验证这一点,那就太好了。
更新
我无法转换通用表达式。似乎这是不可能的。您需要在返回之前显式转换表达式。
关于c# - 动态生成 LINQ(成员)表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41692802/