加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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或其他类型.无论目标属性类型如何,此代码都将构建正确的表达式树.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读