我正在尝试从名为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()
,然后可以将其传递给其他方法。
如何做到这一点?
我正在尝试构建一个动态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
}
答案 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);