gpt4 book ai didi

c# - 如何从属性名称创建 Expression> 表达式

转载 作者:行者123 更新时间:2023-11-30 13:44:11 25 4
gpt4 key购买 nike

我的 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 表达式的最大灵 active 。根据目标属性类型,它可能并不总是 Expression<Func<TModel, string>>。 - 最后一个类型可能是 int或者是其他东西。无论目标属性类型如何,此代码都将构建正确的表达式树。

关于c# - 如何从属性名称创建 Expression<Func<TModel, string>> 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43719219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com