在动态构建表达式上调用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
,其中关键的类型并不重要。但是要分组的属性可以是Guid
、int
或其他类型的。这就是为什么我需要调用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
}
标题>
您可以使用以下Expression.Call
重载为例:
var toString = Expression.Call(member, "ToString", Type.EmptyTypes);
var selector = Expression.Lambda<Func<T, string>>(toString, parameter);
return source.GroupBy(selector);