c# – 如何从Property Name创建Expression> expression
发布时间:2020-12-15 23:38:59 所属栏目:百科 来源:网络整理
导读:我的 Html帮助方法如下所示 public static MvcHtmlString ControlTModel(this MyHtmlHelperTModel helper,string propertyName,LayoutHelper layout,TemplateType templateType = TemplateType.Screen){ //... } 我想将我的属性名称转换为以下内容 Expressio
我的
Html帮助方法如下所示
public static MvcHtmlString Control<TModel>(this MyHtmlHelper<TModel> helper,string propertyName,LayoutHelper layout,TemplateType templateType = TemplateType.Screen) { //... } 我想将我的属性名称转换为以下内容 Expression<Func<TModel,string>> expression 任何帮助都感激不尽 解决方法
看起来你想要调用ModelMetadata.FromLambdaExpression,而不是FromStringExpression.你可以创建一个表达式
x => x.PropertyName 从头开始,像这样: // Get a reference to the property var propertyInfo = ExpressionHelper.GetPropertyInfo<TModel>(propertyName); var model = ExpressionHelper.Parameter<TModel>(); // Build the LINQ expression tree backwards: // x.Prop var key = ExpressionHelper.GetPropertyExpression(model,propertyInfo); // x => x.Prop var keySelector = ExpressionHelper.GetLambda(typeof(TModel),propertyInfo.PropertyType,model,key); 为了使代码更具可读性,将细节表达式树操作移入此辅助类: public static class ExpressionHelper { private static readonly MethodInfo LambdaMethod = typeof(Expression) .GetMethods() .First(x => x.Name == "Lambda" && x.ContainsGenericParameters && x.GetParameters().Length == 2); private static MethodInfo GetLambdaFuncBuilder(Type source,Type dest) { var predicateType = typeof(Func<,>).MakeGenericType(source,dest); return LambdaMethod.MakeGenericMethod(predicateType); } public static PropertyInfo GetPropertyInfo<T>(string name) => typeof(T).GetProperties() .Single(p => p.Name == name); public static ParameterExpression Parameter<T>() => Expression.Parameter(typeof(T)); public static MemberExpression GetPropertyExpression(ParameterExpression obj,PropertyInfo property) => Expression.Property(obj,property); public static LambdaExpression GetLambda<TSource,TDest>(ParameterExpression obj,Expression arg) => GetLambda(typeof(TSource),typeof(TDest),obj,arg); public static LambdaExpression GetLambda(Type source,Type dest,ParameterExpression obj,Expression arg) { var lambdaBuilder = GetLambdaFuncBuilder(source,dest); return (LambdaExpression)lambdaBuilder.Invoke(null,new object[] { arg,new[] { obj } }); } } 从头开始构建表达式树使您在创建lambda表达式时具有最大的灵活性.根据目标属性类型,它可能不总是表达式< Func< TModel,string>> – 最后一种类型可以是int或其他类型.无论目标属性类型如何,此代码都将构建正确的表达式树. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |