gpt4 book ai didi

c# - 在动态构建的表达式上调用 ToString()

转载 作者:行者123 更新时间:2023-12-02 00:50:32 24 4
gpt4 key购买 nike

我正在尝试根据名为 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
}

最佳答案

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

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

关于c# - 在动态构建的表达式上调用 ToString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40339262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com