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

时间:2016-10-31 09:13:34

标签: c# reflection expression expression-trees

我正在尝试从名为source的IQueryable上的一系列属性名称(由用户提供)构建动态表达式。 这就是我到目前为止所做的:

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

当输入为x => x.MainProperty.SubProperty时,会给我类似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
}

1 个答案:

答案 0 :(得分:3)

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

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