在动态构建表达式上调用ToString()

本文关键字:ToString 调用 动态 构建 表达式 | 更新日期: 2023-09-27 18:15:34

我试图从一个名为source的IQueryable属性名称字符串(由用户给出)建立一个动态表达式。这是我目前所看到的:

var parameter = Expression.Parameter(source.ElementType, "x");
var member = propertyChain.Split('.').Aggregate((Expression)parameter, Expression.PropertyOrField);
var selector = Expression.Lambda(member, parameter);

当输入是MainProperty.SubProperty时,会得到类似x => x.MainProperty.SubProperty的值

我现在需要将ToString()添加到表达式selector中,这样它将产生表达式x => x.MainProperty.SubProperty.ToString(),然后可以将其传递到其他方法中。

如何做到这一点?

<标题>编辑1

我试图建立一个动态的GroupBy,其中关键的类型并不重要。但是要分组的属性可以是Guidint或其他类型的。这就是为什么我需要调用ToString()

public static IEnumerable<IGrouping<string, T>>(IQueryable<T> source, string propertyChain)
{
    var parameter = Expression.Parameter(source.ElementType, "x");
    var member = propertyChain.Split('.').Aggregate((Expression)parameter, Expression.PropertyOrField);
    var selector = Expression.Lambda(member, parameter);
    // currently here I have x => x.MainProperty.SubProperty
    // here I would Invoke the GroupBy of IQueryable with T and string via reflection
}

在动态构建表达式上调用ToString()

您可以使用以下Expression.Call重载为例:

var toString = Expression.Call(member, "ToString", Type.EmptyTypes);
var selector = Expression.Lambda<Func<T, string>>(toString, parameter);
return source.GroupBy(selector);