C# 对动态生成表达式调用ToString()

C# 对动态生成表达式调用ToString(),c#,reflection,expression,expression-trees,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 = Expressio

我正试图从名为
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.subperty
时,它将给我类似于
x=>x.MainProperty.subperty的东西

我现在需要将
ToString()
添加到表达式
选择器
,这样它将生成表达式
x=>x.MainProperty.subperty.ToString()
,然后可以将该表达式传递到其他方法中

如何做到这一点

编辑1 我试图构建一个动态的
GroupBy
,其中键的类型无关紧要。但是分组依据的属性可以是
Guid
int
或其他类型。这就是为什么我需要调用
ToString()

公共静态IEnumerable(IQueryable源代码,字符串属性链)
{
var参数=Expression.parameter(source.ElementType,“x”);
var成员=propertyChain.Split('.').Aggregate((表达式)参数,Expression.PropertyOrField);
var选择器=Expression.Lambda(成员、参数);
//目前,我有x=>x.MainProperty.subperty
//在这里,我将通过反射使用T和string调用IQueryable的GroupBy
}
例如,您可以使用以下重载:

var toString = Expression.Call(member, "ToString", Type.EmptyTypes);
var selector = Expression.Lambda<Func<T, string>>(toString, parameter);
return source.GroupBy(selector);
var-toString=Expression.Call(成员,“toString”,Type.EmptyTypes);
var选择器=Expression.Lambda(toString,参数);
返回source.GroupBy(选择器);
例如,您可以使用以下重载:

var toString = Expression.Call(member, "ToString", Type.EmptyTypes);
var selector = Expression.Lambda<Func<T, string>>(toString, parameter);
return source.GroupBy(selector);
var-toString=Expression.Call(成员,“toString”,Type.EmptyTypes);
var选择器=Expression.Lambda(toString,参数);
返回source.GroupBy(选择器);

你能给出一个工作示例吗?@JeroenvanLangen我已经添加了一个示例,说明我至少要用这个实现什么?你能给出一个工作示例吗?@JeroenvanLangen我添加了一个示例,说明我至少要用这个实现什么,这正是我所需要的。现在我可以把我喜欢的东西分组;)。ThanksHow我可以将字符串列表(
{“PropertyOne”,“PropertyTwo”}
)转换为
选择器
s=>s.PropertyOne+“|”+s.PropertyTwo
,其中列表可以包含未知数量的字符串吗?您可以使用
表达式。调用
string.Concat
重载之一(例如)假设您使用上述方法创建了两个表达式-
toString1
toString2
。然后选择器的主体将是
Expression.Call(typeof(string).GetMethod(“Concat”,new[]{typeof(string),typeof(string),typeof(string)}),toString1,Expression.Constant(“|”)和toString2)
这太棒了。再次感谢!看起来你对这个表达的东西很了解;-)。你能推荐什么教程/书吗?正是我需要的。现在我可以把我喜欢的东西分组;)。ThanksHow我可以将字符串列表(
{“PropertyOne”,“PropertyTwo”}
)转换为
选择器
s=>s.PropertyOne+“|”+s.PropertyTwo
,其中列表可以包含未知数量的字符串吗?您可以使用
表达式。调用
string.Concat
重载之一(例如)假设您使用上述方法创建了两个表达式-
toString1
toString2
。然后选择器的主体将是
Expression.Call(typeof(string).GetMethod(“Concat”,new[]{typeof(string),typeof(string),typeof(string)}),toString1,Expression.Constant(“|”)和toString2)
这太棒了。再次感谢!看起来你对这个表达的东西很了解;-)。你想/可以推荐哪些教程/书籍?